我正在迁移一段代码以使用泛型。这样做的一个理由是,for循环比跟踪索引或使用显式迭代器干净得多。

在大约一半的情况下,列表(ArrayList)通过使用索引以相反的顺序迭代。

谁能建议一种更干净的方法来做到这一点(因为我不喜欢索引for循环时使用集合),尽管它确实有效?

 for (int i = nodes.size() - 1; i >= 0; i--) {
    final Node each = (Node) nodes.get(i);
    ...
 }

注意:我不能在JDK之外添加任何新的依赖项。


当前回答

原因:“不知道为什么没有ArrayList的descent iterator…”

因为数组列表不保持列表在相同的顺序,因为数据已添加到列表。所以,千万不要用数组列表。

链表将保持数据与ADD到list的顺序相同。

所以,在上面的例子中,我使用了ArrayList()来让用户扭曲他们的思想,让他们从他们的角度去锻炼一些东西。

而不是这个

List<String> list = new ArrayList<String>();

USE:

List<String> list = new LinkedList<String>();

list.add("ravi");

list.add("kant");

list.add("soni");

// Iterate to disply : result will be as ---     ravi kant soni

for (String name : list) {
  ...
}

//Now call this method

Collections.reverse(list);

// iterate and print index wise : result will be as ---     soni kant ravi

for (String name : list) {
  ...
}

其他回答

我认为使用for循环语法是不可能的。我唯一的建议就是:

Collections.reverse(list);
for (Object o : list) {
  ...
}

... 但我不会说这个“更干净”,因为它的效率会更低。

试试这个:

// Substitute appropriate type.
ArrayList<...> a = new ArrayList<...>();

// Add elements to list.

// Generate an iterator. Start just after the last element.
ListIterator li = a.listIterator(a.size());

// Iterate in reverse.
while(li.hasPrevious()) {
  System.out.println(li.previous());
}

你可以使用具体的类LinkedList来代替一般的接口List。然后你有一个向下迭代器用于反向迭代。

LinkedList<String > linkedList;
for( Iterator<String > it = linkedList.descendingIterator(); it.hasNext(); ) {
    String text = it.next();
}

不知道为什么没有ArrayList的descent iterator…

下面是一个(未经测试的)ReverseIterable的实现。当iterator()被调用时,它创建并返回一个私有的ReverseIterator实现,它简单地将对hasNext()的调用映射到hasPrevious(),并将对next()的调用映射到previous()。这意味着你可以逆向遍历一个数组列表,如下所示:

ArrayList<String> l = ...
for (String s : new ReverseIterable(l)) {
  System.err.println(s);
}

类定义

public class ReverseIterable<T> implements Iterable<T> {
  private static class ReverseIterator<T> implements Iterator {
    private final ListIterator<T> it;

    public boolean hasNext() {
      return it.hasPrevious();
    }

    public T next() {
      return it.previous();
    }

    public void remove() {
      it.remove();
    }
  }

  private final ArrayList<T> l;

  public ReverseIterable(ArrayList<T> l) {
    this.l = l;
  }

  public Iterator<T> iterator() {
    return new ReverseIterator(l.listIterator(l.size()));
  }
}

原因:“不知道为什么没有ArrayList的descent iterator…”

因为数组列表不保持列表在相同的顺序,因为数据已添加到列表。所以,千万不要用数组列表。

链表将保持数据与ADD到list的顺序相同。

所以,在上面的例子中,我使用了ArrayList()来让用户扭曲他们的思想,让他们从他们的角度去锻炼一些东西。

而不是这个

List<String> list = new ArrayList<String>();

USE:

List<String> list = new LinkedList<String>();

list.add("ravi");

list.add("kant");

list.add("soni");

// Iterate to disply : result will be as ---     ravi kant soni

for (String name : list) {
  ...
}

//Now call this method

Collections.reverse(list);

// iterate and print index wise : result will be as ---     soni kant ravi

for (String name : list) {
  ...
}