所以我一直在查看一些我理解的java代码用于foreach循环,但看起来它过于复杂了。
我有一个包含属性的Control.java文件。
我有一个使用Iterator的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();
}
}
其他文件使用它:
public void dumpInstantiation(StringBuffer buf)
{
for(Control control : controls)
{
control.dumpInstantiation(buf);
}
}
据我所知,这只是一个foreach循环,在迭代每个控件时添加或删除(或调用任何其他方法)的额外好处。作为一个java新手,我想到几个问题:
答案 0 :(得分:3)
有没有更简单的方法来实现这个?这是通常的做法吗?
为了使用Java foreach
构造,您的类需要实现Iterable
接口,并在所需方法中提供足够的功能来“迭代”列表并返回每个项目。通常这意味着您需要知道何时剩余物品以及逐步返回每个物品的方法。接口API将告诉您方法是否“必需”(即:必须声明方法,但不能提供实现)。一种更简单的方法是利用已有的集合类型,因此您不必自己创建。
这样做有什么其他好处吗?
这是一种很好的方法,可以提供一个很好的方法来允许用户迭代您的列表,并使该类与在Iterable
上运行的其他接口兼容
有没有办法在没有ArrayList和Iterator的情况下做到这一点?
您可以将您的类包装在已经实现迭代器的现有集合中,但这取决于您。
答案 1 :(得分: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);
}
}
打印相同。
这是否回答了你的问题?