我想在列表上有一个反向的列表视图(类似于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一起工作。


当前回答

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

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

其他回答

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

我用这个:

public class ReversedView<E> extends AbstractList<E>{

    public static <E> List<E> of(List<E> list) {
        return new ReversedView<>(list);
    }

    private final List<E> backingList;

    private ReversedView(List<E> backingList){
        this.backingList = backingList;
    }

    @Override
    public E get(int i) {
        return backingList.get(backingList.size()-i-1);
    }

    @Override
    public int size() {
        return backingList.size();
    }

}

是这样的:

ReversedView.of(backingList) // is a fully-fledged generic (but read-only) list

Collections.reverse (num)…它实际上颠倒了元素的顺序。 下面的代码应该是非常赞赏-

List<Integer> nums = new ArrayList<Integer>();
nums.add(61);
nums.add(42);
nums.add(83);
nums.add(94);
nums.add(15);
//Tosort the collections uncomment the below line
//Collections.sort(nums); 

Collections.reverse(nums);

System.out.println(nums);

输出:15,94、83、61

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

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

它不是很优雅,但是如果你使用List。listIterator(int index)你可以获得一个双向的listIterator到列表的末尾:

//Assume List<String> foo;
ListIterator li = foo.listIterator(foo.size());

while (li.hasPrevious()) {
   String curr = li.previous();
}