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

新手上路,请多包涵

我想在列表上有一个反向列表视图(类似于 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(); }
            };
        }
    };
}


我刚刚发现一些 List 实现有 descendingIterator() 这正是我需要的。尽管 List 没有通用的此类实现。这有点奇怪,因为我在 LinkedList 中看到的实现足够通用,可以与任何 List 一起使用。

原文由 Albert 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 576
2 个回答

Guava 提供了这个: 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 不同,这纯粹是一个 视图……它不会改变原始列表中元素的顺序。此外,对于可修改的原始列表,对原始列表和视图的更改会反映在另一个中。

原文由 ColinD 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

因此,

 Collections.reverse(list.clone());

如果您使用的是 List 并且无权访问 clone() 您可以使用 subList()

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

原文由 jcalvert 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题