【问题标题】:Java reverse foreach [duplicate]Java反向foreach [重复]
【发布时间】:2012-03-09 00:49:41
【问题描述】:

可能重复:
Can one do a for each loop in java in reverse order?

对于前向迭代:

for (int i=0; i<pathElements.length; i++){
    T pathElem = pathElements[i];
    .......
}

我可以将其编码为 foreach:

for(T pathElem : pathElements){
    .......
}

是否有开关让 foreach 可以反向迭代?

for (int i=pathElements.length-1; i>=0; i--){
    T pathElem = pathElements[i];
    .......
}

foreach 中是否有反向迭代开关?

(如果没有,您不认为 JDK 8、9 等包含此功能会是一个令人兴奋的想法吗?)

【问题讨论】:

标签: java


【解决方案1】:

这基本上是不可能的,因为 foreach 循环是基于 IterableIterator 接口的,而且它们没有反向迭代的概念。

【讨论】:

  • 一个很好的例子就是无限序列。由于不存在“最后一个”元素,因此在数学上不可能颠倒顺序。
  • 我看到 this 链接并认为我们可以做到这一点
  • @saman:您可以为已排序的事物(如 TreeSet)或具有索引概念(如 List 或数组)的事物执行此操作,诚然,这些是大多数我们通常使用 for 循环的东西,但对于一般的Iterable 来说仍然是不可能的。
【解决方案2】:

使用番石榴:

for (T elem : Lists.reverse(Arrays.asList(array))) {
  ...
}

以列表的形式迭代数组的反向视图。 (所以只有一个恒定的开销,并且您不会更改底层数组。)

【讨论】:

    【解决方案3】:

    (如果不是,你不认为 JDK 8、9、 等等,包括这个功能吗?

    不确定我是否看到了此类功能的价值。

    现在,您可以简单地在已使用 Arrays.asList 转换为列表的数组副本上使用 Collections.reverse 并对其进行迭代。

    【讨论】:

    • 价值就在那里。您可以(理想情况下)在 foreach 行中添加一个单词,而不是所有这些额外的行和潜在的处理。
    • 或者至少是 JDK 内置的 ReverseIterator,这样您就不必每次都自己动手或使用第 3 方...
    【解决方案4】:

    不,没有。您将得到的最接近的方法是先反转数组。

    ArrayUtils.reverse(array);
    for (Item x : array){}
    

    【讨论】:

      【解决方案5】:

      如果 pathElements 是您的自定义类,那么您可以通过实现 Iterable 来定义它应该如何迭代,否则您可以简单地封装 pathElements 并覆盖 Iterable 实现方法。

      你也可以做这样的事情并覆盖 Iterable 接口方法:

      public class pathElementsReversed extends pathElements {}
      

      你可以像这样使用每个:

      foreach (pathElement p : (pathElementsReversed) pathElements) {...}
      

      【讨论】:

        猜你喜欢
        • 2018-03-22
        • 2011-05-06
        • 2014-05-01
        • 2015-05-10
        • 1970-01-01
        • 2013-01-08
        • 2013-01-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多