将int 0的所有元素移到ArrayList的后面?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将int 0的所有元素移到ArrayList的后面?相关的知识,希望对你有一定的参考价值。

我正在创建一个方法,将0的所有实例移到ArrayList的最后,但保留其他数字的原始顺序。

public static ArrayList<Integer> 
zerosBack(ArrayList<Integer> arr)
{
    for(int i = 0; i < arr.size(); i++){
        if(arr.get(i) == 0){
            arr.remove(i);
            arr.add(0);
        }
    }
    return arr;

}

这个方法似乎对所有的输入都有效,除了这个。[4, 0, 0, 0, 0, 0]

我的程序输出: [0,0,4,0,0,0] 而不是[4,0,0,0,0,0]。

答案

一般来说,最好的办法是从最后迭代一个ArrayList,并在删除元素时移动到前面。这样可以消除从列表前部到列表尾部时发生的索引错误。例如,下面的代码应该可以工作。

    public static ArrayList<Integer> zerosBack(ArrayList<Integer> arr) {
    for (int i = arr.size()-1; i>=0; i--) {
        if (arr.get(i) == 0) {
            arr.remove(i);
            arr.add(0);
        }
    }
    return arr;

}
另一答案

你可以跟踪原来的大小,然后删除所有的零,然后用原来的大小和当前的大小一次性地把它们加回来。

public static List<Integer> zerosBack(List<Integer> arr) {
    int count = arr.size();
    arr.removeIf(v -> v == 0);
    if (count != arr.size()) {
        arr.addAll(Collections.nCopies(count - arr.size(), 0));
    }

    return arr;
}
另一答案

如果你想要更多的时间和空间效率的代码,而且元素的排序并不重要。

static ArrayList<Integer> zerosBack(ArrayList<Integer> arr) {
        int firstCounter = 0;
        int lastCounter = arr.size() - 1;
        while (lastCounter > firstCounter) {
            if (0 == arr.get(lastCounter)) {
                lastCounter--;
                continue;
            }
            if (0 != arr.get(firstCounter)) {
                firstCounter++;
                continue;
            }
            arr.set(firstCounter, arr.get(lastCounter));
            arr.set(lastCounter, 0);
        }
        return arr;
    }

以上是关于将int 0的所有元素移到ArrayList的后面?的主要内容,如果未能解决你的问题,请参考以下文章

C ++:使用向量将特定数字移到后面

moveZeros

util之ArrayList

Android:ArrayList 将项目移动到位置 0

Java ArrayList中去掉相同的元素并保留相同元素中的最后一个

int []数组的Arraylist