11

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

4

6 回答 6

10

不幸的是,Java 仅支持基本的foreach循环,称为增强型 for 循环。其他语言,尤其是像 Scala 这样的 FP 语言,支持一种称为列表推导的构造(Scala 将其称为推导),它允许嵌套迭代以及沿途过滤元素。

于 2013-08-04T17:11:19.483 回答
10

不,你不能。它是使用Iterator的语法糖。请参阅此处以获得有关此问题的良好答案。

您需要有一个包含两个变量的对象。

例如,它可以显示在 Map 对象上。

for (Map.Entry<String,String> e: map.entrySet()) {
    // you can use e.getKey() and e.getValue() here
}
于 2013-08-04T17:04:37.553 回答
4

以下应该具有您尝试实现的相同(性能)效果:

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();
}
于 2015-01-24T05:33:33.977 回答
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();
}

这是我能想到的最接近的,但我认为它没有多大用处。如果两个集合都打算一起迭代,那么首先创建 a 会更简单Collection<TwoThings>

除了并行迭代之外,您还可能希望按顺序迭代。有一些实现,例如 Guava 的Iterables.concat()

于 2013-08-04T17:51:52.503 回答
1

简单的答案“不”已经给出。但是您可以实现将两个迭代器作为参数,并返回来自两个迭代器的元素对。配对是具有两个字段的类。您要么必须自己实现它,要么它可能存在于某些 apache commons 或类似的库中。

然后可以在 foreach 循环中使用这个新的迭代器。

于 2013-08-04T18:18:31.443 回答
0

我必须完成一项任务,我需要从 XML 收集各种数据并存储在 SET 接口中,然后将它们输出到 CSV 文件。

我读取数据并将其存储在 Set interface object as 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")

 }
于 2019-03-19T20:33:32.320 回答