Fix an off-by-1 error in the remove method.

The change to only grow the array when the capacity has been reached
exposed a bug in the remove method when shifting the array elements.
This commit is contained in:
Dain 2012-07-06 13:53:18 -06:00 committed by Joel Dice
parent 8706b6ad4a
commit 26209efac2
2 changed files with 23 additions and 3 deletions

View File

@ -131,13 +131,14 @@ public class ArrayList<T> extends AbstractList<T> implements java.io.Serializabl
public T remove(int index) {
T v = get(index);
if (index == size - 1) {
int newSize = size - 1;
if (index == newSize) {
array[index] = null;
} else {
System.arraycopy(array, index + 1, array, index, size - index);
System.arraycopy(array, index + 1, array, index, newSize - index);
}
int newSize = size - 1;
shrink(newSize);
size = newSize;

View File

@ -145,6 +145,24 @@ public class List {
}
}
private static void testRemove() {
ArrayList<String> foo = new ArrayList<String>(2);
foo.add("Uno");
foo.add("Dos");
foo.add("Tres");
foo.add("Cuatro");
ArrayList<String> fooToRemove = new ArrayList<String>(2);
fooToRemove.add(foo.get(0));
fooToRemove.add(foo.get(1));
for (String s : fooToRemove) {
foo.remove(s);
}
expect(foo.size() == 2);
}
public static void main(String args[]) {
ArrayList<Integer> l = new ArrayList<Integer>();
l.add(1); l.add(2); l.add(3); l.add(4); l.add(5);
@ -170,5 +188,6 @@ public class List {
testIterators2(new ArrayList());
testIterators2(new LinkedList());
testGrow();
testRemove();
}
}