反转此ArrayList的最简单方法是什么?
ArrayList aList = new ArrayList();
//Add elements to ArrayList object
aList.add("1");
aList.add("2");
aList.add("3");
aList.add("4");
aList.add("5");
while (aList.listIterator().hasPrevious())
Log.d("reverse", "" + aList.listIterator().previous());
10 回答
示例(Reference):
不是最简单的方法,但如果你是递归的粉丝,你可能会对以下方法感兴趣来反转ArrayList:
或非递归:
这里的诀窍是定义“反向” . 可以在适当的位置修改列表,以相反的顺序创建副本,或者以相反的顺序创建视图 .
直观地说,最简单的方法是
Collections.reverse
:此方法会修改列表 . 也就是说,
Collections.reverse
获取列表并覆盖其元素,不留下任何未反转的副本 . 这适用于某些用例,但不适用于其他用例;此外,它假定列表是可修改的 . 如果这是可以接受的,我们很好 .如果没有,可以按相反顺序创建副本:
这种方法有效,但需要在列表上迭代两次 . 复制构造函数(
new ArrayList<>(list)
)遍历列表,Collections.reverse
也是如此 . 如果我们如此倾向,我们可以重写此方法只迭代一次:这样更有效,但也更冗长 .
或者,我们可以重写上面的内容来使用Java 8的
stream
API,有些人发现它比上面更简洁明了:NB .
Collectors.toList()
对结果列表提供的保证很少 . 如果要确保结果以ArrayList形式返回,请改用Collectors.toCollection(ArrayList::new)
.第三种选择是以相反的顺序创建视图 . 这是一个更复杂的解决方案,值得进一步阅读/自己的问题 . Guava 的Lists#reverse方法是一个可行的起点 .
选择“最简单”的实现留给读者练习 .
解决方案,无需使用额外的ArrayList或add()和remove()方法的组合 . 如果你必须撤销一个巨大的列表,两者都会产生负面影响 .
以递归方式反转ArrayList而不创建用于添加元素的新列表:
更可读:)
另一种递归解决方案
为了防止我们使用 Java 8 ,我们可以使用Stream . ArrayList是随机访问列表,我们可以按相反顺序获取元素流,然后将其收集到新的
ArrayList
中 .上述方法不适用于LinkedList,因为它不是随机访问 . 我们也可以使用
instanceof
进行检查 .我们也可以使用java 8来做同样的事情 .