如何使用for each循环填充ArrayList?(Java)

3
我必须使用 for each 循环将前十个二的倍数填入 ArrayList 中。我真的不知道该如何做,也不能使用其他循环。以下是我的代码,但它并不起作用。
   ArrayList<Integer> arraylist = new ArrayList<Integer>(10);  
   for (Integer y : arraylist) {
         arraylist.add( (2+(y*2)));      
   }

2
你确定要使用“for each”循环而不是普通的“for”循环吗? - Tom
你能创建像这样的列表吗?List<Integer> arraylist = (List<Integer>) Arrays.asList(new Integer[10]); - Prem
7个回答

6

解决方案很简单。

final int[] numbers = new int[] {2,4,6,8,10,12,14,16,18,20};
final List<Integer> list = new ArrayList<Integer>();
for (int number : numbers) {
    list.add(number);
}

1
这确实符合所有规格。 - ryanyuyu

5
也许像这样的东西吗?
IntStream.range(0, 10).map(y -> 2 + y * 2).forEach(arraylist::add);

太过于深奥了。这位学生是计算机科学的初学者 :)),不要吓到他。 - nucandrei
1
@nucandrei 想不到其他能包含 for-each 循环的东西了 :D - Bubletan
1
@nucandrei:无论如何,我喜欢这个解决方案。不只有初学者会查看这个答案。 - Makoto
@Bubletan 请看我的回答。它实现了你所写的功能,但没有使用lambda表达式。 - nucandrei

4
您的循环遍历了arrayList中的所有值,因为它是空的,所以循环中的部分实际上从未运行。请使用:
for(int i = 0 ; i < 10 ; i++)
     arrayList.add(2 * (i + 1));

替代

@jHilscher,对于一个空集合而言,foreach循环永远不会执行。 - ryanyuyu
我真的很好奇,OP会如何在空的ArrayList上使用for-each循环... - user4668606
@Paul 只有在使用单独的非空集合进行 foreach 操作时才能正常工作。例如,创建一个包含 10 个“y”值的数组,然后使用另一个集合对其进行 foreach 操作以填充该数组。 - ryanyuyu
我知道,但在这种情况下,您首先必须创建数组或使用其他内容。这是您再次遇到相同问题的关键点。 - user4668606
@Paul 是的。除非你将其设置为硬编码数组或其他形式。 - ryanyuyu
@Paul,你为什么认为op应该在那个列表上使用for each循环?这显然是错误的,但这并不意味着这个任务不能使用“常规”的for循环。目前这个任务还不清楚。 - Tom

3
我将解决大家大多数忽略的问题:普通的for语句和增强型for语句之间存在关键差异。
增强型for被定义为语法糖,具体取决于您要迭代的内容,所得到的是何种类型的糖。在JLS中有定义
  • If you're iterating over an Iterable like an ArrayList, it is using the Iterator from that entity.

    for(I #i=Expression.iterator(); #i.hasNext();){
        VariableModifiersopt TargetType Identifier=
        (TargetType) #i.next();
        Statement
    }
    
  • If you're iterating over an array, then it's shorthand for the common for statements one is accustomed to doing.

    T[] #a = Expression;
    L1: L2: ... Lm:
    for (int #i = 0; #i < #a.length; #i++) {
        VariableModifiersopt TargetType Identifier = #a[#i];
        Statement
    }
    
因此,增强型for循环有一个假设:
您迭代的内容必须是非空集合或数组。
该语句仅用于迭代现有元素,而不提供一种方法或接口来逐步添加新元素。
有许多方法可以解决这个问题,但最简单的方法是最常见的方法:使用一个for语句。
ArrayList<Integer> arraylist = new ArrayList<Integer>(10);  
for (int i = 0; i < 10; i++) {
    arraylist.add( (2+(i*2)));      
}

D'oh!“你要迭代的必须是一个非空的集合或数组。”谢谢,我曾经也有同样的疑问,直到看到你的答案,非常有帮助! - JimLohse

1
您正在使用10作为构造函数参数创建ArrayList,这定义了它的初始容量(默认情况下已经是10),但不设置任何值。换句话说,您尝试迭代一个空列表,因此从未进入它。
您不能用for-each实现这一点,可以使用for来实现。
final List<Integer> myList = new ArrayList<>();
for(int i = 1; i <= 10; i++)
   myList.add(2 * i);

1
什么意思?
int[] values = new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (int i : values) { list.add(i * 2); }

抱歉,您需要提供要翻译的英文文本。

1
与数组不同,ArrayList 不会在初始化时被赋予对象。因此,在初始化后,ArrayList 的大小将为零。一个解决方法是从 Arrays 创建列表,如下所示:(但这只是一种解决方法)。但即使在这种情况下,List 也将被初始化为 null,而不是 0。因此,y 将为 null。
List<Integer> arraylist = Arrays.asList(new Integer[10]);
        //Collections.fill(arraylist, new Integer(1));
        System.out.println(arraylist);
        int i=0;
        for (Integer y : arraylist) {
             //System.out.println( (2+(y*2)));
             arraylist.set(i++, ((i*2)));      
       }

最好注释掉这一行 System.out.println( (2+(y*2)));,因为它会导致空指针异常。 - Tom
与Integer[]不同,int[]将使用0进行初始化。但是,在int[]和integer[]之间不支持自动装箱。 - Prem
@Tom,是的,你说得对,我的评论不是针对你的评论。我的评论是关于为什么我不能使用int[]。 - Prem
好的,那么我们不再需要我的第二条评论了 :)。 - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接