Collections.reverse无法正常工作

时间:2018-05-27 23:55:22

标签: java

我定义了一个包含int []的列表类。

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; }
}

我试图反转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));

结果

list=[4, 2, 0, 1, 3]
reversed list=[4, 2, 0, 2, 4]
reversed array=[4, 2, 0, 2, 4]

有什么问题?

1 个答案:

答案 0 :(得分:3)

您应该在set中返回已替换的元素:

@Override public Integer set(int i, Integer e) { 
  int res = array[i];
  array[i] = e; 
  return res;
}

否则,return array[i] = e;会返回e。这打破了reverse,例如,在第一步中:

    被替换为3 会覆盖
  • 上次4
  • 返回4而不是3
  • 4位于第一个位置
  • 您在第一个和最后一个元素中最终得到两个4