输出比我使用 LinkedList 的预期输出奇怪



当程序运行时,它会输出 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

因为在每次迭代中,您都会删除要打印的元素。这将打破指数。例如,当你删除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));

或使用增强型 for 循环:

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

如果你真的想在打印LinkedList时删除项目,你应该使用Iterator。像您正在执行的那样删除元素会导致未定义的行为。做这样的事情:

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

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

一开始你的列表看起来像这样:

693 239 33 999 862 965 994 884 127 977

在第一次迭代后,您调用remove(0)它将如下所示

239 33 999 862 965 994 884 127 977

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

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

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

相关内容

  • 没有找到相关文章

最新更新