Skip to content

Commit 853ca37

Browse files
committed
Implement addAll with index for CustomArrayList. Fix bug in previous addAll (w/o index)
1 parent 382429a commit 853ca37

File tree

2 files changed

+57
-25
lines changed

2 files changed

+57
-25
lines changed

src/main/java/by/andd3dfx/collections/custom/CustomArrayList.java

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -204,26 +204,46 @@ public boolean addAll(Collection<? extends T> c) {
204204
}
205205

206206
var incomingArray = c.toArray();
207-
if (array.length >= size + c.size()) {
208-
System.arraycopy(incomingArray, 0, array, size, c.size());
209-
} else {
210-
int oldLength = array.length;
211-
var newLength = oldLength;
207+
if (array.length < size + c.size()) {
208+
var newLength = array.length;
212209
while (newLength < size + c.size()) {
213210
newLength *= RESIZE_FACTOR;
214211
}
215212
var newArray = (T[]) new Object[newLength];
216213
System.arraycopy(array, 0, newArray, 0, size);
217214
array = newArray;
218-
System.arraycopy(incomingArray, 0, array, size, c.size());
219215
}
216+
System.arraycopy(incomingArray, 0, array, size, c.size());
217+
size += c.size();
218+
220219
return true;
221220
}
222221

223222
@Override
224223
public boolean addAll(int index, Collection<? extends T> c) {
225-
// TODO add implementation
226-
throw new NotImplementedException();
224+
if (c.isEmpty()) {
225+
return false;
226+
}
227+
228+
var incomingArray = c.toArray();
229+
if (array.length < size + c.size()) {
230+
var newLength = array.length;
231+
while (newLength < size + c.size()) {
232+
newLength *= RESIZE_FACTOR;
233+
}
234+
var newArray = (T[]) new Object[newLength];
235+
236+
System.arraycopy(array, 0, newArray, 0, index);
237+
System.arraycopy(incomingArray, 0, newArray, index, c.size());
238+
System.arraycopy(array, index, newArray, index + c.size(), size - index);
239+
array = newArray;
240+
} else {
241+
System.arraycopy(array, index, array, index + c.size(), size - index);
242+
System.arraycopy(incomingArray, 0, array, index, c.size());
243+
}
244+
size += c.size();
245+
246+
return true;
227247
}
228248

229249
@Override

src/test/java/by/andd3dfx/collections/custom/CustomArrayListTest.java

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -356,36 +356,29 @@ public void testContainsAll() {
356356
}
357357

358358
@Test
359-
public void testAddAllNoResize() {
360-
List<String> list = new CustomArrayList<>();
359+
public void testAddAll_NoResize() {
360+
var list = new CustomArrayList<>();
361361
list.add("Andrei");
362362
list.add("Tikhon");
363363
list.add("Ilya");
364364

365365
list.addAll(List.of("Taisia", "Nika"));
366366

367-
assertThat(list.contains("Andrei")).isTrue();
368-
assertThat(list.contains("Tikhon")).isTrue();
369-
assertThat(list.contains("Ilya")).isTrue();
370-
assertThat(list.contains("Taisia")).isTrue();
371-
assertThat(list.contains("Nika")).isTrue();
367+
assertThat(list.size()).isEqualTo(5);
368+
assertThat(list.toString()).isEqualTo("[Andrei, Tikhon, Ilya, Taisia, Nika]");
372369
}
373370

374371
@Test
375-
public void testAddAllResizeRequired() {
376-
List<String> list = new CustomArrayList<>();
372+
public void testAddAll_ResizeRequired() {
373+
var list = new CustomArrayList<>();
377374
list.add("Andrei");
378375
list.add("Tikhon");
379376
list.add("Ilya");
380377

381378
list.addAll(List.of("Taisia", "Nika", "Taisia", "Nika", "Taisia", "Alexey", "Taisia", "Nika"));
382379

383-
assertThat(list.contains("Andrei")).isTrue();
384-
assertThat(list.contains("Tikhon")).isTrue();
385-
assertThat(list.contains("Ilya")).isTrue();
386-
assertThat(list.contains("Taisia")).isTrue();
387-
assertThat(list.contains("Nika")).isTrue();
388-
assertThat(list.contains("Alexey")).isTrue();
380+
assertThat(list.size()).isEqualTo(11);
381+
assertThat(list.toString()).isEqualTo("[Andrei, Tikhon, Ilya, Taisia, Nika, Taisia, Nika, Taisia, Alexey, Taisia, Nika]");
389382
}
390383

391384
@Test
@@ -511,9 +504,28 @@ public void subList() {
511504
}
512505

513506
@Test
514-
public void addAllWithIndex() {
507+
public void testAddAllWithIndex_NoResize() {
515508
var list = new CustomArrayList<>();
509+
list.add("Andrei");
510+
list.add("Tikhon");
511+
list.add("Ilya");
512+
513+
list.addAll(1, List.of("Taisia", "Nika"));
514+
515+
assertThat(list.size()).isEqualTo(5);
516+
assertThat(list.toString()).isEqualTo("[Andrei, Taisia, Nika, Tikhon, Ilya]");
517+
}
518+
519+
@Test
520+
public void testAddAllWithIndex_ResizeRequired() {
521+
var list = new CustomArrayList<>();
522+
list.add("Andrei");
523+
list.add("Tikhon");
524+
list.add("Ilya");
525+
526+
list.addAll(1, List.of("Taisia", "Nika", "Taisia", "Nika", "Taisia", "Alexey", "Taisia", "Nika"));
516527

517-
assertThrows(NotImplementedException.class, () -> list.addAll(1, List.of(25, 27)));
528+
assertThat(list.size()).isEqualTo(11);
529+
assertThat(list.toString()).isEqualTo("[Andrei, Taisia, Nika, Taisia, Nika, Taisia, Alexey, Taisia, Nika, Tikhon, Ilya]");
518530
}
519531
}

0 commit comments

Comments
 (0)