奇怪的输出比我使用链接列表的预期输出

时间:2013-10-31 07:49:25

标签: java arrays loops linked-list

当程序运行时,它输出10个随机数,每个数字存储到LinkedList列表中,然后显示该列表,只显示4-5个数字,而不是原始数组中的10个。这是简单的代码:

import java.util.LinkedList;
import java.util.Random;

public class randomSum {
    private static Random rand = new Random();
    private static LinkedList<Integer> arr = new LinkedList<Integer>();

    public static void main(String[] args) {
        int num = 0;

        System.out.println("Original List");
        for(int i=0; i < 10; i++) {
            num = rand.nextInt(1000);
            arr.add(num);
            System.out.println(num);
        }

        System.out.println("\nLinkedList List");
        for(int j=0; j < arr.size(); j++)
            System.out.println(arr.remove(j));
    }
}

输出就是这样,这与我的预期不完全相同。它们都应该是一样的。为什么会这样?

Original List
693
239
33
999
862
965
994
884
127
977

LinkedList List
693
33
862
994
127

4 个答案:

答案 0 :(得分:4)

因为在每次迭代时,您都要删除要打印的元素。这将打破指数。例如,当您移除index 0处的元素时,index 1处的元素现在移至index 0,但循环索引现在移至index 1。因此,刚刚转移到index 0的元素从未被处理过。这将发生在每个替代元素上,因此您可以获得该输出。

您需要使用get(j)代替remove(j)

for(int j=0; j < arr.size(); j++)
    System.out.println(arr.get(j));

或使用enhanced for loop

for (int val: arr) {
    System.out.println(val);
}

答案 1 :(得分:1)

如果您确实要在打印LinkedList时删除项目,则应使用Iterator。删除您正在执行的元素会导致未定义的行为。做那样的事情:

Iterator<Integer> it = arr.iterator();
while(it.hasNext()) {
    int element = it.next();
    System.out.println(element);
    it.remove();
}

答案 2 :(得分:0)

在这个答案中,我想说明实际发生的事情,以便你理解为什么remove(j)可能不是你想要的,就像Rohit Jain所说的那样。

在开始时,您的列表如下所示:

693 239 33 999 862 965 994 884 127 977

在第一次迭代之后,您调用remove(0)它将看起来像这样

239 33 999 862 965 994 884 127 977

因此,当您在下一次迭代中调用remove(1)时,您将删除元素33,该元素最初是第三个元素。因此,相对于原始列表,每次迭代实际上由两个元素组成。

答案 3 :(得分:0)

你看到输出的规定了吗?它是原始列表中的每个其他数字。 每次使用arr.remove(j)时,列表arr都会将大小缩小1.因此循环在j == 5时结束,同时arr.size()= 5。此外,你使用arr.remove(j),然后删除jTH项目,并在j ++之后,跳过原始的(j + 1)当前jTH项目。因此规定所有其他数字都来自原始列表。

如果你替换remove来获得它将按预期工作。 并且,您可以替换remove(j)以删除(0)并将循环结束条件更改为j <10,这也可以正常工作。