本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看<活动链接>
提问:如何翻转ArrayList
中的数据?
ArrayList<Integer> 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());
复制代码
回答一
这不是最简单的方法,但如果你是递归的爱好者,你可能会对以下翻转ArrayList
的方法感兴趣。
public ArrayList<Object> reverse(ArrayList<Object> list) {
if(list.size() > 1) {
Object value = list.remove(0);
reverse(list);
list.add(value);
}
return list;
}
复制代码
不用递归也可以
public ArrayList<Object> reverse(ArrayList<Object> list) {
for(int i = 0, j = list.size() - 1; i < j; i++) {
list.add(i, list.remove(j));
}
return list;
}
复制代码
回答二
最简单的方法就是使用Collections.reverse
Collections.reverse(myList);
复制代码
这个方法会覆盖集合中的元素,不会返回一个原始集合。这个特性可能只适用于部分用例。此外,这个方法还假设集合是可修改的。
如果不用这种办法,我们可以按相反顺序创建出集合的副本。
static <T> List<T> reverse(final List<T> list) {
final List<T> result = new ArrayList<>(list);
Collections.reverse(result);
return result;
}
复制代码
这个方法在功能上是可行的,但需要在列表上迭代两次,在每次遍历时都会创建一个ArrayList
对象,当然Collections.reverse()
的代码逻辑也是如此。如果你愿意的话,我们可以优化下这个方法,让它只迭代一次:
static <T> List<T> reverse(final List<T> list) {
final int size = list.size();
final int last = size - 1;
// create a new list, with exactly enough initial capacity to hold the (reversed) list
final List<T> result = new ArrayList<>(size);
// iterate through the list in reverse order and append to the result
for (int i = last; i >= 0; --i) {
final T element = list.get(i);
result.add(element);
}
// result now holds a reversed copy of the original list
return result;
}
复制代码
这样效率变高了,但是代码却变得冗余了。那我们就使用Java8的Stream API
再次优化下这段代码:
static <T> List<T> reverse(final List<T> list) {
final int last = list.size() - 1;
return IntStream.rangeClosed(0, last) // a stream of all valid indexes into the list
.map(i -> (last - i)) // reverse order
.mapToObj(list::get) // map each index to a list element
.collect(Collectors.toList()); // wrap them up in a list
}
复制代码
注意Collectors.toList()
返回类型是List
,如果要确保结果以ArrayList
的形式返回,请改用
Collectors.toCollection(ArrayList::new)
复制代码
文章翻译自Stack Overflow:stackoverflow.com/questions/1…
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END