在Java的for-each循环中有办法吗

for(String s : stringArray) {
  doSomethingWith(s);
}

找出循环已经被处理的频率?

除了使用老的和众所周知的for(int i=0;I <边界;i++) - loop,是构造

int i = 0;
for(String s : stringArray) {
  doSomethingWith(s);
  i++;
}

在for-each循环中有这样一个计数器的唯一方法是什么?


当前回答

我有点惊讶没有人提出以下建议(我承认这是一个懒惰的方法…); 如果stringArray是某种类型的List,您可以使用类似stringArray. indexof (S)的东西来返回当前计数的值。

注意:这假设List的元素是唯一的,或者它们是否非唯一并不重要(因为在这种情况下,它将返回找到的第一个副本的索引)。

在某些情况下,这就足够了……

其他回答

pax的答案有一个“变体”…: -)

int i = -1;
for(String s : stringArray) {
    doSomethingWith(s, ++i);
}

惯用的解决方案:

final Set<Double> doubles; // boilerplate
final Iterator<Double> iterator = doubles.iterator();
for (int ordinal = 0; iterator.hasNext(); ordinal++)
{
    System.out.printf("%d:%f",ordinal,iterator.next());
    System.out.println();
}

这实际上是谷歌在关于为什么他们不提供CountingIterator的讨论中提出的解决方案。

下面是我如何做到这一点的一个例子。这将获得每个循环的索引。希望这能有所帮助。

public class CheckForEachLoop {

    public static void main(String[] args) {

        String[] months = new String[] { "JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST",
                "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER" };
        for (String s : months) {
            if (s == months[2]) { // location where you can change
              doSomethingWith(s); // however many times s and months
                                  // doSomethingWith(s) will be completed and 
                                  // added together instead of counter
            }

        }
        System.out.println(s); 


    }
}

还有另一种方法。

如果您编写了自己的Index类和一个静态方法,该方法在该类的实例上返回Iterable,那么您可以

for (Index<String> each: With.index(stringArray)) {
    each.value;
    each.index;
    ...
}

其中实现With。索引是这样的

class With {
    public static <T> Iterable<Index<T>> index(final T[] array) {
        return new Iterable<Index<T>>() {
            public Iterator<Index<T>> iterator() {
                return new Iterator<Index<T>>() {
                    index = 0;
                    public boolean hasNext() { return index < array.size }
                    public Index<T> next() { return new Index(array[index], index++); }
                    ...
                }
            }
        }
    }
}

虽然有很多其他的方法可以达到同样的效果,但我还是将我的方法分享给一些不满意的用户。我正在使用Java 8 IntStream特性。

1. 数组

Object[] obj = {1,2,3,4,5,6,7};
IntStream.range(0, obj.length).forEach(index-> {
    System.out.println("index: " + index);
    System.out.println("value: " + obj[index]);
});

2. 列表

List<String> strings = new ArrayList<String>();
Collections.addAll(strings,"A","B","C","D");

IntStream.range(0, strings.size()).forEach(index-> {
    System.out.println("index: " + index);
    System.out.println("value: " + strings.get(index));
});