如何在Java中获取列表的反向列表视图?

2022-08-31 05:43:02

我希望在列表上有一个反向列表视图(与在列表上提供子列表视图的方式类似)。是否有某些功能提供此功能?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(); }                 
            };
        }
    };
}

我刚刚发现一些实现具有我需要的。虽然 没有针对 的一般此类实现。这有点奇怪,因为我看到的实现足够通用,可以与任何.ListdescendingIterator()ListLinkedListList


答案 1

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

因此

Collections.reverse(list.clone());

如果您使用的是 a 并且没有访问权限,则可以使用 subList()Listclone()

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

答案 2

番石榴提供了这个: Lists.reverse(List)

List<String> letters = ImmutableList.of("a", "b", "c");
List<String> reverseView = Lists.reverse(letters); 
System.out.println(reverseView); // [c, b, a]

与 ,这纯粹是一种观点...它不会改变原始列表中元素的顺序。此外,对于可修改的原始列表,对原始列表和视图的更改都会反映在另一个列表中。Collections.reverse