Java增强了for循环

时间:2010-11-29 21:45:39

标签: java for-loop foreach

目前(从Java 6开始),使用Java的增强型for循环我不知道有什么方法可以直接访问迭代器索引,而不是恢复到旧的索引for循环或使用外部计数器。

是否有计划(或者当前的方法)来实现这个“增强的增强”for循环,其中一个人能够访问循环的索引(甚至可能操纵它)?

作为可能需要的示例,请考虑(这是来自实际的生产代码):

int i = 1;
for (final String action : actions) {
  parameters.set(String.valueOf(i++), action);
}

5 个答案:

答案 0 :(得分:15)

好吧,就像你说的那样,如果你必须有一个索引,只需使用一个标准的for循环,或者手动更新一个计数器。

但重新考虑你的问题。为什么需要for (Object o : list)循环中的索引?

使用增强循环的整点是抽象使用索引或迭代器的令人讨厌的部分。

今天的大多数语言都没有在循环中提供这种功能。举个例子,Pythonic的方法是:

for index, val in enumerate(someList):
    # ....

答案 1 :(得分:7)

没有。使用外部变量。

答案 2 :(得分:6)

为什么他们需要提供另一种按索引访问元素的方式?

当您不需要元素的索引时,会创建增强的for循环作为快捷方式。它简化了事情。

如果您仍然需要索引,请回到常规for循环。这就是他们在那里的原因之一。

答案 3 :(得分:2)

最好保留一个外部计数器来获取索引,但你可以做这样的事情(这对于一个简单的任务来说有点过分)

class Enum<T> implements Iterable<Indexer<T>> {
    private int indx;
    private Iterator<T> itr;
    private Indexer<T> indxr = new Indexer<T>();

    private Enum(Iterable<T> iter) {
        this.itr = iter.iterator();
    }

    public static <T> Enum<T> iterate(Iterable<T> iter) {
        return new Enum<T>(iter);
    }

    @Override
    public Iterator<Indexer<T>> iterator() {
        return new AbstractIterator<Indexer<T>>() {
            @Override
            protected Indexer<T> computeNext() {
                if (itr.hasNext()) {
                    indxr.index = indx++;
                    indxr.val = itr.next();
                    return indxr;
                }
                return endOfData();
            }

        };
    }

}

class Indexer<T> {
    public int index;
    public T val;

    @Override
    public String toString() {
        return String.format("[ %d : %s ]", index, val);
    }

在迭代时获取索引:

    List<Integer> list = new ArrayList<Integer>() ;
    list.addAll(Arrays.asList(1, 2, 3, 4, 5,6,55,23,12,24,16));
    for (Indexer<Integer> en : Enum.iterate(list)) 
      System.out.println(en.index+" "+en.val);

注意:上述代码依赖于Guava's AbstractIterator

答案 4 :(得分:1)

除非你保留一个柜台,否则现在没有办法!我知道这很难看,但java 7会更好。我不知道为什么其他人说我们不需要它。有时我们需要知道什么是最后一个成员,或奇数成员等。