如何翻转ArrayList中的数据?| Java Debug 笔记

本文正在参加「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
喜欢就支持一下吧
点赞0 分享