user4910279
user4910279

Reputation:

Collections.reverse doesn't work correctly

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

Answers (1)

Andrey Tyukin
Andrey Tyukin

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:

  • last 3 is overridden by replaced 4
  • a 4 is returned instead of 3
  • this 4 is placed at the first position
  • You end up with two 4s both in first and last element.

Upvotes: 3

Related Questions