需要解释此代码如何处理Arraylist值

时间:2014-08-12 08:58:19

标签: java arraylist

public static void mystery1(ArrayList<Integer> list) { 
for (int i = list.size() - 1; i > 0; i--) { 
    if (list.get(i) < list.get(i - 1)) { 
        int element = list.get(i); 
        list.remove(i); 
        list.add(0, element); 
    } 
} 
System.out.println(list);
}

我正在尝试使用给定的ArrayList values集解决此方法的输出。在查看之后,我非常确定这段代码会重新定位列表前面的一对较小的值。我使用值[2, 6, 1, 8]的ArrayList作为输入,结果是[1, 2, 6, 8],这正如我所料。但是对于[30, 20, 10, 60, 50, 40],当我预期[10, 30, 40, 20, 60, 50]时,它会生成[40,50,10,20,30,60]。因此,任何人都可以向我解释这段代码如何实际处理Arraylist?谢谢!

3 个答案:

答案 0 :(得分:1)

以下是一步一步发生的事情:

  • 您的清单的初始状态:[30,20,10,60,50,40]
  • 40 <50?是。所以删除40,并把它作为列表的第一个元素:[40,30,20,10,60,50]
  • 是否<10?不,不要碰任何东西:[40,30,20,10,60,50]
  • 10 <20?是。所以删除10,并把它作为列表的第一个元素:[10,40,30,20,60,50]
  • 30 <40?是。所以删除30,并把它作为列表的第一个元素:[30,10,40,20,60,50]
  • 10 <30?是。所以删除10,并将其作为列表的第一个元素:[10,30,40,20,60,50]。

结果是:[10,30,40,20,60,50]

答案 1 :(得分:0)

我认为你忘记了循环从列表的末尾到开头。如果你把你给出的列表作为输入并按照这个过程你会得到结果[10,30,40,20,60,50]。哪个是正确的。只需用纸做,你就会看到。

答案 2 :(得分:0)

由于对您的问题的评论已经说明,看起来这个算法没有做到它所做的。这当然只能由原始代码的设计者验证;)。

现在简要介绍代码的作用,我将下面的每次迭代放入中间列表结果。第一个位置(冒号前)是迭代中索引的值。

// index 6, number 40 is less than 50, so 40 moves to the start of the list
result: 40  30  20  10  60  50
// index 5, number 60 is greater than 10, no changes made to the list
result: 40  30  20  10  60  50
// index 4, number 10 is less than 20, so 10 moves to the start of the list
result: 10  40  30  20  60  50
// index 3, number 30 is less than 40....
result: 30  10  40  20  60  50
// index 2, number 10 is less than 30....
result: 10  30  40  20  60  50

et瞧,有你的结果。