Skip to content

Commit 96a0a48

Browse files
committed
add CyclicArrayDeque
1 parent 2c0d476 commit 96a0a48

File tree

2 files changed

+95
-30
lines changed

2 files changed

+95
-30
lines changed
Lines changed: 82 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,124 @@
11
package seminar1.collections;
22

3+
import java.util.Arrays;
34
import java.util.Iterator;
5+
import java.util.NoSuchElementException;
46

57
public class CyclicArrayDeque<Item> implements IDeque<Item> {
68

9+
private static final int DEFAULT_CAPACITY = 10;
710
private Item[] elementData;
11+
private int head;
12+
private int tail;
13+
private int size;
14+
15+
public CyclicArrayDeque() {
16+
this.elementData = (Item[]) new Object[DEFAULT_CAPACITY];
17+
head = tail = 0;
18+
size = 0;
19+
}
820

921
@Override
1022
public void pushFront(Item item) {
11-
/* TODO: implement it */
23+
if (isEmpty()) {
24+
elementData[head] = item;
25+
size++;
26+
return;
27+
}
28+
if (size == elementData.length)
29+
grow();
30+
elementData[(--head + elementData.length) % elementData.length] = item;
31+
size++;
1232
}
1333

1434
@Override
1535
public void pushBack(Item item) {
16-
/* TODO: implement it */
36+
if (isEmpty()) {
37+
elementData[head] = item;
38+
size++;
39+
return;
40+
}
41+
if (size == elementData.length)
42+
grow();
43+
elementData[(++tail + elementData.length) % elementData.length] = item;
44+
size++;
1745
}
1846

1947
@Override
2048
public Item popFront() {
21-
/* TODO: implement it */
22-
return null;
49+
if (isEmpty())
50+
throw new NoSuchElementException();
51+
Item item = elementData[(head++ + elementData.length) % elementData.length];
52+
size--;
53+
if (size * 4 < elementData.length && size != 0)
54+
shrink();
55+
return item;
2356
}
2457

2558
@Override
2659
public Item popBack() {
27-
/* TODO: implement it */
28-
return null;
60+
if (isEmpty())
61+
throw new NoSuchElementException();
62+
Item item = elementData[(tail-- + elementData.length) % elementData.length];
63+
size--;
64+
if (size * 4 < elementData.length && size != 0)
65+
shrink();
66+
return item;
2967
}
3068

3169
@Override
3270
public boolean isEmpty() {
33-
/* TODO: implement it */
34-
return false;
71+
return size == 0;
3572
}
3673

3774
@Override
3875
public int size() {
39-
/* TODO: implement it */
40-
return 0;
76+
return size;
4177
}
4278

4379
private void grow() {
44-
/**
45-
* TODO: implement it
46-
* Если массив заполнился,
47-
* то увеличить его размер в полтора раз
48-
*/
80+
changeCapacity((int)(elementData.length * 1.5D));
4981
}
5082

5183
private void shrink() {
52-
/**
53-
* TODO: implement it
54-
* Если количество элементов в четыре раза меньше,
55-
* то уменьшить его размер в два раза
56-
*/
84+
changeCapacity((int)(elementData.length / 2D));
85+
}
86+
87+
private void changeCapacity(int newCapacity) {
88+
Item[] newElementData = (Item[]) new Object[newCapacity];
89+
if ((head + elementData.length) % elementData.length <= (tail + elementData.length) % elementData.length) {
90+
for (int i = head, j = 0; i <= tail; i++, j++)
91+
newElementData[j] = elementData[i];
92+
} else {
93+
int j = 0;
94+
for (int i = head; i < elementData.length; i++)
95+
newElementData[j++] = elementData[i];
96+
for (int i = 0; i <= tail; i++)
97+
newElementData[j++] = elementData[i];
98+
}
99+
head = 0;
100+
tail = head + size - 1;
101+
elementData = Arrays.copyOf(newElementData, newCapacity);
57102
}
58103

59104
@Override
60105
public Iterator<Item> iterator() {
61-
/* TODO: implement it */
62-
return null;
106+
return new CyclicArrayDequeIterator();
107+
}
108+
109+
private class CyclicArrayDequeIterator implements Iterator<Item> {
110+
111+
private int currentPosition = head;
112+
113+
@Override
114+
public boolean hasNext() {
115+
return currentPosition != tail;
116+
}
117+
118+
@Override
119+
public Item next() {
120+
return elementData[(currentPosition++ + elementData.length) % elementData.length];
121+
}
122+
63123
}
64124
}

tests/TestDeque.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
import java.lang.reflect.InvocationTargetException;
2-
import java.util.Arrays;
3-
import java.util.Collection;
4-
import java.util.NoSuchElementException;
5-
import java.util.Random;
2+
import java.util.*;
63

74
import org.junit.Assert;
85
import org.junit.Before;
@@ -60,8 +57,6 @@ public void test01_isEmpty() {
6057
Assert.assertEquals(deque.size(), 0);
6158
}
6259

63-
//в тестах с Foreach одновременно тестируется итератор
64-
6560
@Test
6661
public void test02_PushFront() {
6762
deque.pushFront(2);
@@ -133,7 +128,6 @@ public void test10_AnyPopBack() {
133128
deque.pushBack(randomArray[i]);
134129
}
135130
for (int i = 9; i >= 0; i--) {
136-
System.out.println(randomArray[i]);
137131
Assert.assertEquals(randomArray[i], (int)deque.popBack());
138132
}
139133
}
@@ -145,7 +139,6 @@ public void test011_AnyPopFront() {
145139
deque.pushBack(randomArray[i]);
146140
}
147141
for (int i = 0; i < 10; i++) {
148-
System.out.println(randomArray[i]);
149142
Assert.assertEquals(randomArray[i], (int)deque.popFront());
150143
}
151144
}
@@ -170,4 +163,16 @@ public void test013_FailPopBack() {
170163
}
171164
}
172165

166+
@Test
167+
public void test014_Iterator() {
168+
int[] randomArray = getRandomArray(10);
169+
for (int i = 0; i < 10; i++) {
170+
deque.pushBack(randomArray[i]);
171+
}
172+
Iterator<Integer> iterator = deque.iterator();
173+
int i = 0;
174+
while (iterator.hasNext())
175+
Assert.assertEquals(randomArray[i++], (int)iterator.next());
176+
}
177+
173178
}

0 commit comments

Comments
 (0)