反转ArrayList:为什么我必须等于列表大小的一半?

时间:2019-03-14 23:11:59

标签: java arraylist

今天早些时候,我的教授给出了在不返回新数组的情况下反转数组的课堂作业,他希望(但没有告诉我们)在不添加和追加元素的情况下这样做。我想出的解决方案如下:

ArrayList<Double> al = new ArrayList<Double>();
  al.add(5.00);
  al.add(1.00);
  al.add(4.00);
  al.add(2.00);
  al.add(3.00);
for (int i = al.size()-1; i >=0; i--)
{
   double temp = al.get(i);
   int zeroUp = ((al.size()-1)-i);

   al.set(zeroUp, temp);
}
System.out.println(al.toString());

我注意到prints: [3.0, 2.0, 4.0, 2.0, 3.0].每次都中途停止,但是我不明白为什么。 Set()不会删除其值将被发送到传递的索引的元素,对吗?我在某个随机网站上发现正确答案是:

for (int i = al.size() / 2; i >=0; i--)
{                                   
   double temp = al.get(i);
   int zeroUp = ((al.size()-1)-i);
   al.set(i, al.get(zeroUp));
   al.set(zeroUp, temp);
}
System.out.println(al.toString());
  

输出:[5.0、1.0、4.0、2.0、3.0]

再次,为什么我们必须将size()除以2并为我标记的元素定义值?

1 个答案:

答案 0 :(得分:2)

因为要在原位反转数组 。您认为Set()不会删除其值要发送到传递的索引的元素是正确的。

因此,您拥有数组[5,1,4,2,3]。一旦函数完成一半,数组就是[3,2,4,2,3]。请注意,中间元素两侧的元素如何互为镜像。这意味着当您尝试将下半部设置为上半部时,上半部已经等于下半部。

换句话说,为了反转数组,您只需要将前一半与后一半交换即可。 [5,1,4,2,3]-> [3,1,4,2,5]-> [3,2,4,1,5]

我不知道这是否可以说得很清楚,但我希望它会有所帮助