Reputation:
I defined a list class that wraps int[] like this.
class IntList extends AbstractList<Integer> {
private final int[] array;
public IntList(int[] array) { this.array = array; }
@Override public int size() { return array.length; }
@Override public Integer get(int i) { return array[i]; }
@Override public Integer set(int i, Integer e) { return array[i] = e; }
}
And I tried to reverse int[].
int[] array = {4, 2, 0, 1, 3};
List<Integer> list = new IntList(array);
System.out.println("list=" + list);
Collections.reverse(list);
System.out.println("reversed list=" + list);
System.out.println("reversed array=" + Arrays.toString(array));
The results are
list=[4, 2, 0, 1, 3]
reversed list=[4, 2, 0, 2, 4]
reversed array=[4, 2, 0, 2, 4]
What is the problem?
Upvotes: 5
Views: 688
Reputation: 44928
You should return the replaced element in set
:
@Override public Integer set(int i, Integer e) {
int res = array[i];
array[i] = e;
return res;
}
Otherwise, return array[i] = e;
returns e
. This breaks the reverse
, because for example, in first step:
3
is overridden by replaced 4
4
is returned instead of 3
4
is placed at the first position4
s both in first and last element.Upvotes: 3