如何在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.Deque
有descendingIterator()
– 如果你的List
是Deque
,你可以使用它。
我知道这是一个老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);