Java中的新for循环可以与两个变量一起使用吗?

时间:2013-08-04 17:02:49

标签: java

我们可以使用旧的for循环(for(i = 0, j = 0; i<30; i++,j++))和两个变量 我们可以在java(for(Item item : items)中使用带有两个变量的for-each循环(或增强的for循环)吗?它的语法是什么?

6 个答案:

答案 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")

 }