我想在列表上有一个反向的列表视图(类似于list #sublist提供列表上的子列表视图)。是否有提供这种功能的函数?

我不想复制列表,也不想修改列表。

在这种情况下,如果我至少能在列表上获得一个反向迭代器就足够了。


此外,我知道如何实现这自己。我只是问Java是否已经提供了类似的东西。

演示实现:

static <T> Iterable<T> iterableReverseList(final List<T> l) {
    return new Iterable<T>() {
        public Iterator<T> iterator() {
            return new Iterator<T>() {
                ListIterator<T> listIter = l.listIterator(l.size());                    
                public boolean hasNext() { return listIter.hasPrevious(); }
                public T next() { return listIter.previous(); }
                public void remove() { listIter.remove(); }                 
            };
        }
    };
}

我刚刚发现一些列表实现有descent iterator(),这是我所需要的。尽管List没有这样的通用实现。这有点奇怪,因为我在LinkedList中看到的实现足够通用,可以与任何List一起工作。


当前回答

使用List中的.clone()方法。它将返回一个浅拷贝,这意味着它将包含指向相同对象的指针,因此您不必复制列表。然后使用集合。

Ergo,

Collections.reverse(list.clone());

如果你正在使用一个List并且没有clone(),你可以使用subList():

List<?> shallowCopy = list.subList(0, list.size());
Collections.reverse(shallowCopy);

其他回答

java.util.Deque有descent iterator() -如果你的List是Deque,你可以使用它。

我知道这是一个老帖子,但今天我正在寻找这样的东西。最后,我自己编写了代码:

private List reverseList(List myList) {
    List invertedList = new ArrayList();
    for (int i = myList.size() - 1; i >= 0; i--) {
        invertedList.add(myList.get(i));
    }
    return invertedList;
}

不推荐用于长列表,这根本没有优化。对于受控场景,这是一种简单的解决方案(我处理的list元素不超过100个)。

希望它能帮助到一些人。

当你请求一个对象时,你也可以反转位置:

Object obj = list.get(list.size() - 1 - position);

你还可以这样做:

static ArrayList<String> reverseReturn(ArrayList<String> alist)
{
   if(alist==null || alist.isEmpty())
   { 
       return null;
   }

   ArrayList<String> rlist = new ArrayList<>(alist);

   Collections.reverse(rlist);
   return rlist;
}

使用List中的.clone()方法。它将返回一个浅拷贝,这意味着它将包含指向相同对象的指针,因此您不必复制列表。然后使用集合。

Ergo,

Collections.reverse(list.clone());

如果你正在使用一个List并且没有clone(),你可以使用subList():

List<?> shallowCopy = list.subList(0, list.size());
Collections.reverse(shallowCopy);