如何在Java中反转列表?

我想在列表上有一个反转的列表视图(类似于List#sublist提供列表中的子列表视图)。 有没有提供这种function的一些function?

我不想做任何列表的副本,也不要修改列表。

在这种情况下,如果在列表中至less可以得到一个反向迭代器就足够了。


另外,我知道如何自己实现这个。 我只是问,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

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

在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<String> foo; ListIterator li = foo.listIterator(foo.size()); while (li.hasPrevious()) { String curr = li.previous() } 

java.util.DequedescendingIterator() – 如果你的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; } 

不build议长列表,这根本没有被优化。 对于受控scheme来说,这是一种简单的解决scheme(我处理的列表不超过100个元素)。

希望它有助于某人。

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

 List<Integer> nums = new ArrayList<Integer>(); nums.add(61); nums.add(42); nums.add(83); nums.add(94); nums.add(15); Collections.sort(nums); Collections.reverse(nums); System.out.println(nums); 

我使用这个:

 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 

你也可以这样做:

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

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

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

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

 List<String> 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