我们可以使用旧的for循环(for(i = 0, j = 0; i<30; i++,j++)
)和两个变量
我们可以在java(for(Item item : items)
中使用带有两个变量的for-each循环(或增强的for循环)吗?它的语法是什么?
答案 0 :(得分:10)
不,你不能。它是使用Iterator的语法糖。有关此问题的详细解答,请参阅here。
您需要一个包含两个变量的对象。
例如,它可以在Map对象上显示。
for (Map.Entry<String,String> e: map.entrySet()) {
// you can use e.getKey() and e.getValue() here
}
答案 1 :(得分:10)
不幸的是,Java只支持一个基本的 foreach 循环,称为增强型循环。其他语言,尤其是像Scala这样的FP,支持一种称为 list comprehension 的构造(Scala称之为 for comprehension ),它允许嵌套迭代,以及沿着方式。
答案 2 :(得分:3)
以下内容应具有您尝试实现的相同(效果)效果:
List<Item> aItems = new List<Item>();
List<Item> bItems = new List<Item>();
...
Iterator aIterator = aItems.iterator();
Iterator bIterator = bItems.iterator();
while (aIterator.hasNext() && bIterator.hasNext()) {
Item aItem = aIterator.next();
Item bItem = bIterator.next();
}
答案 3 :(得分:1)
foreach循环假定只有一个集合。您可以为每个迭代的每个元素执行一些操作。如果您可以一次迭代两个集合,您希望它如何表现?如果他们有不同的长度怎么办?
假设你有
Collection<T1> collection1;
Collection<T2> collection2;
你可以编写一个迭代包装器,迭代两者并返回某种合并结果。
for(TwoThings<T1, T2> thing : new TwoCollectionWrapper(collection1, collection2) {
// one of them could be null if collections have different length
T1 t1 = thing.getFirst();
T2 t2 = thing.getSecond();
}
这是我能想到的最接近但我认为没有太多用处。如果两个集合都要一起迭代,那么首先创建Collection<TwoThings>
会更简单。
除了并行迭代之外,您还可能希望按顺序迭代。有实现,例如,番石榴的Iterables.concat()
答案 4 :(得分:1)
已经给出了简单的答案“否”。但是你可以实现将两个迭代器作为参数,并返回来自两个迭代器的元素对。配对是一个有两个字段的类。您要么必须自己实现,要么可能存在于某些apache commons或类似的lib中。
然后可以在foreach循环中使用这个新的迭代器。
答案 5 :(得分:0)
我必须执行一项任务,我需要从XML收集各种数据并将其存储在SET接口中,然后将它们输出到CSV文件中。
我读取数据并将其存储为Set接口对象中的x,y,z。
对于CSV文件标题,我使用了字符串缓冲区来保存标题 字符串缓冲区
StringBuffer buffer = new StringBuffer("");
buffer.append("FIRST_NAME,LAST_NAME,ADDRESS\r\n")
Set<String> x = new HashSet<String>();
Set<String> y = new HashSet<String>();
Set<String> z = new HashSet<String>();
....
Iterator iterator1 = x.iterator()
Iterator iterator2 = y.iterator()
Iterator iterator3 = z.iterator()
while(iterator1.hasNext() && iterator2.hasNext() && iterator3.hasNext()){
String fN = iterator1.next()
String lN = iterator2.next()
String aDS = iterator3.next()
buffer.append(""+fN+","+lN+","+aDS+"\r\n")
}