Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用LinkedList时输出比预期输出奇怪_Java_Arrays_Loops_Linked List - Fatal编程技术网

Java 使用LinkedList时输出比预期输出奇怪

Java 使用LinkedList时输出比预期输出奇怪,java,arrays,loops,linked-list,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>

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

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

您需要使用
get(j)
而不是
remove(j)


在这个回答中,我想说明实际发生的情况,以便您理解为什么
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
,它最初是第三个元素。因此,每一次迭代实际上都会向前推进两个元素,相对于原始列表。

如果您确实希望在打印时删除项目,则应使用。像您这样删除元素会导致未定义的行为。这样做:

Iterator<Integer> it = arr.iterator();
while(it.hasNext()) {
    int element = it.next();
    System.out.println(element);
    it.remove();
}
Iterator it=arr.Iterator();
while(it.hasNext()){
int元素=it.next();
系统输出打印项次(元素);
it.remove();
}

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

如果您更换remove以获得该功能,它将按照您的预期工作。
并且,您可以将remove(j)替换为remove(0),并将循环结束条件更改为j
System.out.println(arr.remove(j))你确定这就是你想要的吗?更改循环中的列表会产生奇怪的结果。当在列表上循环时,您希望列表中的数据保持不变。至少在我能想到的每种情况下……我最初认为它会在删除每个元素之前打印每个元素。@Minhaj Auto unboxing@Minhaj Search for enhanced for loop。
693 239 33 999 862 965 994 884 127 977
239 33 999 862 965 994 884 127 977
Iterator<Integer> it = arr.iterator();
while(it.hasNext()) {
    int element = it.next();
    System.out.println(element);
    it.remove();
}