【问题标题】:For each loop using Java Iterator [closed]对于使用 Java 迭代器的每个循环 [关闭]
【发布时间】:2015-03-15 10:10:14
【问题描述】:

所以我一直在查看一些我理解的用于 foreach 循环的 java 代码,但它似乎过于复杂。

我有一个包含属性的 Control.java 文件。

我有一个 Controls.java 文件,它使用 Iterator 并将 Control 作为数据类型。

public class Controls implements Iterable<Control>{
    protected ArrayList<Control> controls;

    public Controls()
    {
        controls = new ArrayList<Control>();
    }
    public Controls(ArrayList<Control> controls)
    {
        this.controls = controls;
    }

    public ArrayList<Control> value()
    {
        return controls;
    }

    public void add(Control ctrl)
    {
        this.controls.add(ctrl);
    }

    public void add(Controls ctrls)
    {
        for(Control ctrl : ctrls)
        {
            this.controls.add(ctrl);
        }
    }

    public void remove(Control ctrl)
    {
        if(this.controls.contains(ctrl))
        {
            this.controls.remove(ctrl); 
        } else
        {
            for (Control c: this.controls)
            {
                if(c instanceof ContainerControl)
                {
                    ((ContainerControl)c).controls.remove(ctrl);
                }
            }
        }

    }


    public Control get(String name)
    {
        //stuff here
    }

    @Override
    public Iterator<Control> iterator() {
        return controls.iterator();
    }
}

其他文件也这样使用它:

public void dumpInstantiation(StringBuffer buf)
{
    for(Control control : controls)
    {
        control.dumpInstantiation(buf);
    }
}

据我了解,这只是一个 foreach 循环,具有在迭代每个控件时添加或删除(或调用任何其他方法)的额外好处。作为一个 java 新手,我想到了几个问题:

  1. 有没有更简单的方法来实现它?这是通常的做法吗?
  2. 这样做还有其他好处吗?
  3. 有没有办法在没有 ArrayList 和 Iterator 的情况下做到这一点?

【问题讨论】:

  • 我不确定您认为什么是“过于复杂”。 ArrayLists 有迭代器,所以你可以在上面说for (SomeType x : list)。这个Controls 类只是通过ArrayList 迭代器实现iterator(),所以for (Control control : controls) 相当于通过它的私有ArrayList 字段。那部分一点也不复杂。 addremove 方法与此无关。

标签: java foreach iterator


【解决方案1】:

因此,for-each 循环有两个“参数”。
1. 将数组的每一项的值一一赋值给变量。
2.数组或ArrayList等

一个例子:

public class Test {
    public static void main(String[] args) {

        int[] numbers = new int[] {3,8,5,2};

        for (int i : numbers)
            System.out.println(i);

    }
}

打印:

3 8 5 2

你看,没那么难!

而且,您可以使用 ArrayList 类来动态添加/删除项目,而不是普通数组:

import java.util.ArrayList;

public class Test {
    public static void main(String[] args) {

        ArrayList<Integer> numbers = new ArrayList<Integer>();
        numbers.add(3);
        numbers.add(8);
        numbers.add(5);
        numbers.add(2);
        for (int i : numbers)
            System.out.println(i);

    }
}

打印相同。

这是否回答了您的问题?

【讨论】:

  • 对于第一个示例,我需要使用 List numbers= new ArrayList();而不是 int[] numbers = new int[] {3,8,5,2};因为我的印象是你不能用普通数组做 foreach 循环。
  • int[] numbers is 实际上是一个普通数组,所以你可以。但请注意,您不能将原始数据类型(例如 int、byte 等)与 ArrayList 一起使用。你必须使用例如'ArrayList = new ArrayList();'反而。哦,字符串表示文本,而不是数字。
  • 谢谢,我认为你不能(这让我非常困惑)而且我不知道原始数据类型是有意义的,因为我的示例使用了它自己的。我也打算把它全部写成字符串,但是当我重读你的例子时改变了主意。
  • 也看看this。所以:原始类型也以小写字符开头,但对象应始终以大写字符开头(例如字符串、整数等)。顺便说一句,您使用 来描述 ArrayList 中的数据类型。如果你想在其中放入不同的类型,你也可以使用 ,但是如果你想用数字计算一些东西,你必须使用 '(Integer)someList.get(aNumber )'。 (将值转换为整数)
【解决方案2】:

有没有更简单的方法来实现这一点?这是通常的做法吗?

为了使用Java foreach 构造,您的类需要实现Iterable 接口,并在所需的方法中提供足够的功能来“迭代”列表并返回每个项目。通常这意味着您需要知道何时还有剩余物品以及逐步退回每个物品的方法。接口 API 会告诉您方法是否是“必需的”(即:必须声明该方法,但它不能提供任何实现)。一种更简单的方法是利用现有的集合类型,因此您不必自己制作。

这样做还有其他好处吗?

这是一种很好的方法,可以提供一个很好的方法来允许用户遍历您的列表,并且它使该类与在Iterable 上运行的其他接口兼容

有没有办法在没有 ArrayList 和 Iterator 的情况下做到这一点?

您可以将您的类包装在已经实现迭代器的现有集合中,但这取决于您。

【讨论】:

  • 谢谢!我现在明白了一点
猜你喜欢
  • 1970-01-01
  • 2015-03-02
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 2022-12-21
  • 2014-10-28
  • 2013-12-17
  • 2020-02-03
相关资源
最近更新 更多