对于使用 Java 迭代器的每个循环

For each loop using Java Iterator

所以我一直在查看一些我理解的用于 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 的方法来做到这一点?

Is there an easier way to implement this? Is this how it is usually done?

为了使用 Java foreach 构造,您的 class 需要实现 Iterable 接口,并在所需方法中提供足够的功能 "iterate" 在列表上,return 每个项目。通常这意味着您需要知道什么时候还有剩余的物品,以及一种 return 每一步的方法。接口 API 会告诉你一个方法是否是 "required" (即:该方法必须被声明,但它不能提供任何实现)或不是。一种更简单的方法是利用现有的集合类型,因此您不必自己创建。

Is there any other benefits of doing it this way?

这是一个很好的方法,可以提供一个很好的方法来允许用户遍历您的列表,并且它使 class 与在 Iterable

上运行的其他接口兼容

Is there a way to do this without ArrayList and Iterator?

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

所以,一个 for-each 循环有两个 'arguments'.
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 class 来动态地 add/remove 项,而不是普通数组:

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);

    }
}

打印相同。

这是否回答了您的问题?