如何在Java列表中获得反向列表视图?
我想在列表上有一个反向列表视图(以类似于List的方式在列表中提供子列表视图)。 是否有一些提供此功能的功能?
我不想制作任何类型的列表副本,也不想修改列表。
如果我在这种情况下至少可以在列表上获得反向迭代器就足够了。
另外,我知道如何自己实现这一点。 我只是问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一起使用。
12个解决方案
189 votes
在列表中使用.clone()方法。 它将返回一个浅拷贝,这意味着它将包含指向相同对象的指针,因此您不必复制列表。 然后只使用集合。
人机工程学,
Collections.reverse(list.clone());
如果您使用的是subList()而无法访问clone(),可以使用subList():
List> shallowCopy = list.subList(0, list.size());
Collections.reverse(shallowCopy);
jcalvert answered 2019-03-13T23:44:39Z
184 votes
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不同,这纯粹是一个视图......它不会改变原始列表中元素的顺序。 此外,对于可修改的原始列表,对原始列表和视图的更改将反映在另一个列表中。
ColinD answered 2019-03-13T23:44:01Z
75 votes
如果我理解正确那么它就是一行代码。它对我有用。
Collections.reverse(yourList);
Shakeeb Ayaz answered 2019-03-13T23:45:04Z
26 votes
它不完全优雅,但如果你使用List.listIterator(int index),你可以在列表的末尾获得一个双向ListIterator:
//Assume List foo;
ListIterator li = foo.listIterator(foo.size());
while (li.hasPrevious()) {
String curr = li.previous()
}
kkress answered 2019-03-13T23:45:29Z
17 votes
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
Krishna Kumar Chourasiya answered 2019-03-13T23:46:00Z
4 votes
java.util.Deque具有descendingIterator() - 如果您的List是Deque,您可以使用它。
Bozho answered 2019-03-13T23:46:27Z
3 votes
我知道这是一个老帖子,但今天我正在寻找这样的东西。 最后我自己写了代码:
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个元素)。
希望它对某人有帮助。
CocheLee answered 2019-03-13T23:47:01Z
3 votes
我用这个:
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
Museful answered 2019-03-13T23:47:24Z
1 votes
你也可以这样做:
static ArrayList reverseReturn(ArrayList alist)
{
if(alist==null || alist.isEmpty())
{
return null;
}
ArrayList rlist = new ArrayList<>(alist);
Collections.reverse(rlist);
return rlist;
}
jhdrosos answered 2019-03-13T23:47:49Z
1 votes
您还可以在请求对象时反转位置:
Object obj = list.get(list.size() - 1 - position);
fede1608 answered 2019-03-13T23:48:15Z
1 votes
对于小型列表,我们可以创建LinkedList,然后可以使用降序迭代器:
List stringList = new ArrayList<>(Arrays.asList("One", "Two", "Three"));
stringList.stream().collect(Collectors.toCollection(LinkedList::new))
.descendingIterator().
forEachRemaining(System.out::println); // Three, Two, One
System.out.println(stringList); // One, Two, Three
i_am_zero answered 2019-03-13T23:48:41Z
0 votes
使用reverse(...)类的reverse(...)方法。 将您的列表作为参数传递,您的列表将被颠倒。
Collections.reverse(list);
Shubho Ghosh answered 2019-03-13T23:49:08Z