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

我想在列表上有一个反向列表视图(以类似于List#sublist方式在List#sublist提供子列表视图)。 是否有一些提供此function的function?

我不想制作任何类型的列表副本,也不想修改列表。

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


另外,我知道如何自己实现这一点。 我只是想问Java是否已经提供了这样的东西。

演示实施:

 static  Iterable iterableReverseList(final List l) { return new Iterable() { public Iterator iterator() { return new Iterator() { ListIterator 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

Guava提供了这个: Lists.reverse(List)

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

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

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

人机工程学,

 Collections.reverse(list.clone()); 

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

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

如果我理解正确那么它就是一行代码。它对我有用。

  Collections.reverse(yourList); 

它不完全优雅,但如果你使用List.listIterator(int index),你可以在列表的末尾获得一个双向ListIterator:

 //Assume List foo; ListIterator li = foo.listIterator(foo.size()); while (li.hasPrevious()) { String curr = li.previous() } 

Collections.reverse(nums)…它实际上颠倒了元素的顺序。 下面的代码应该非常感谢 –

 List nums = new ArrayList(); 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,42,61

java.util.DequedescendingIterator() – 如果你的ListDeque ,你可以使用它。

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

 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; } 

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

希望它对某人有帮助。

我用这个:

 public class ReversedView extends AbstractList{ public static  List of(List list) { return new ReversedView<>(list); } private final List backingList; private ReversedView(List 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 

你也可以这样做:

 static ArrayList reverseReturn(ArrayList alist) { if(alist==null || alist.isEmpty()) { return null; } ArrayList rlist = new ArrayList<>(alist); Collections.reverse(rlist); return rlist; } 

您还可以在请求对象时反转位置:

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

对于小型列表,我们可以创建LinkedList ,然后可以使用降序迭代器:

 List stringList = new ArrayList<>(Arrays.asList("One", "Two", "Three")); stringList.stream().collect(Collectors.toCollection(LinkedList::new)) .descendingIterator(). forEachRemaining(System.out::println); // Four, Three, Two, One System.out.println(stringList); // One, Two, Three, Four 

使用java.util.Collections类的reverse(...)方法。 将您的列表作为参数传递,您的列表将被反转。

 Collections.reverse(list);