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

对于使用Java迭代器的每个循环,java,foreach,iterator,Java,Foreach,Iterator,所以我一直在看一些我理解用于foreach循环的java代码,但它似乎过于复杂 我有一个包含属性的Control.java文件 我有一个Controls.java文件,它使用迭代器并将Control作为数据类型 public class Controls implements Iterable<Control>{ protected ArrayList<Control> controls; public Controls() {

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

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

我有一个Controls.java文件,它使用迭代器并将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();
    }
}
据我所知,这只是一个foreach循环,在迭代每个控件时添加或删除(或调用任何其他方法)具有额外的好处。作为一名java新手,我想到了几个问题:

  • 有没有更简单的方法来实现这一点?通常是这样做的吗
  • 这样做还有其他好处吗
  • 有没有一种不用ArrayList和迭代器就可以做到这一点的方法
  • 有没有更简单的方法来实现这一点?通常是这样做的吗

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

    这样做还有其他好处吗

    这是一个很好的方法,可以提供一个很好的方法,允许用户在您的列表上进行迭代,并使该类与在
    Iterable

    有没有一种不用ArrayList和迭代器就可以做到这一点的方法

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

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

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

    这样做还有其他好处吗

    这是一个很好的方法,可以提供一个很好的方法,允许用户在您的列表上进行迭代,并使该类与在
    Iterable

    有没有一种不用ArrayList和迭代器就可以做到这一点的方法


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

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

    例如:

    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 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);
    
        }
    }
    
    import java.util.ArrayList;
    公开课考试{
    公共静态void main(字符串[]args){
    ArrayList编号=新的ArrayList();
    增加(3);
    增加(8);
    增加(5);
    增加(2);
    用于(int i:数字)
    系统输出打印LN(i);
    }
    }
    
    打印相同的


    这回答了您的问题吗?

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

    例如:

    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 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);
    
        }
    }
    
    import java.util.ArrayList;
    公开课考试{
    公共静态void main(字符串[]args){
    ArrayList编号=新的ArrayList();
    增加(3);
    增加(8);
    增加(5);
    增加(2);
    用于(int i:数字)
    系统输出打印LN(i);
    }
    }
    
    打印相同的


    这回答了你的问题吗?

    谢谢!我现在懂多了谢谢!我现在明白多了,我不确定你认为什么“过于复杂”
    ArrayList
    s具有迭代器,因此您可以在迭代器上对(SomeType x:list)说
    。这个
    控件
    类只是通过传递
    ArrayList
    迭代器来实现
    iterator()
    ,因此
    for(Control-Control:Controls)
    相当于通过它的私有
    ArrayList
    字段。那部分一点也不复杂。
    add
    remove
    方法与此无关。我不确定您认为什么“过于复杂”
    ArrayList
    s具有迭代器,因此您可以在迭代器上对(SomeType x:list)
    。这个
    控件
    类只是通过传递
    ArrayList
    迭代器来实现
    iterator()
    ,因此
    for(Control-Control:Controls)
    相当于通过它的私有
    ArrayList
    字段。那部分一点也不复杂。
    add
    remove
    方法与此无关;代替int[]数字=新的int[]{3,8,5,2};因为我的印象是你不能用普通数组做foreach循环。int[]数字实际上是一个普通数组,所以你可以。但请注意,不能将基本数据类型(如int、byte等)与ArrayList一起使用。您必须使用例如'ArrayList=new Array