从数组中删除所有零

时间:2012-01-08 11:47:33

标签: java arrays optimization

我有一个数组:

[0, 5, 6, 0, 0, 2, 5]

我想从中删除所有零,以便返回(保持相同的顺序):

[5, 6, 2, 5]

有没有比以下更简单的方法来删除所有零?

int[] array = {0, 5, 6, 0, 0, 2, 5};
        int len = 0;
        for (int i=0; i<array.length; i++){
            if (array[i] != 0)
                len++;
        }
        int [] newArray = new int[len];
        for (int i=0, j=0; i<array.length; i++){
            if (array[i] != 0) {
                newArray[j] = array[i];
                j++;
            }
        }

我无法在Arrays课程中找到任何方法,Google / SO搜索也没有给我任何好的答案。

10 个答案:

答案 0 :(得分:15)

这是极少数情况下,在代码中显示它比用简单的英语解释更容易:

int targetIndex = 0;
for( int sourceIndex = 0;  sourceIndex < array.length;  sourceIndex++ )
{
    if( array[sourceIndex] != 0 )
        array[targetIndex++] = array[sourceIndex];
}
int[] newArray = new int[targetIndex];
System.arraycopy( array, 0, newArray, 0, targetIndex );
return newArray;

答案 1 :(得分:12)

这个怎么样:

Integer[] numbers = {1, 3, 6, 0, 4, 0, 3};
List<Integer> list = new ArrayList<Integer>(Arrays.asList(numbers));
list.removeAll(Arrays.asList(Integer.valueOf(0)));
numbers = list.toArray(new Integer[list.size()]);
System.out.println(Arrays.toString(numbers));

<强>输出:

[1, 3, 6, 4, 3]

答案 2 :(得分:2)

您只能通过一个循环实现此目的。无论是更好还是更清楚,我都害怕个人品味。

int[] array = {0, 5, 6, 0, 0, 2, 5};
int[] temp = new int[array.length];
int numberOfZeros = 0;
for (int i=0; i<array.length; i++){
  if (array[i] != 0){
    temp[i-numberOfZeros] = array[i];
  } else {
    numberOfZeros++;
  }
}
int[] result = new int[temp.length-numberOfZeros];
System.arraycopy(temp, 0, result, 0, result.length);

另一种选择是使用像List这样的ArrayList实现,您可以从中删除元素,但是您必须使用Integer个实例,而不是{{1} }}Š

int

答案 3 :(得分:2)

此示例使用 Apache Commons 库,希望这对您有用

import org.apache.commons.lang.ArrayUtils;

public class Test {
    public static void main(String args[]) {
        int[] array = {0, 5, 6, 0, 0, 2, 5};

        // this loop is to remove all zeros
        while(ArrayUtils.contains(array, 0))
            array = ArrayUtils.removeElement(array, 0);

        // this loop will print the array elemnents
        for(int i : array)
            System.out.println(i);

    }
}

答案 4 :(得分:2)

使用Java 8,您可以从数组中生成流,应用.filter(),然后将其转换回数组:

int[] array = {0, 5, 6, 0, 0, 2, 5};

int[] filteredArray = Arrays.stream(array).filter(num -> num != 0).toArray();    

// filteredArray = {5, 6, 2, 5};

答案 5 :(得分:1)

您可以删除 O(1) 额外空间中的零。而不是将元素复制到另一个数组中,您只需返回大小并打印相同的数组:

public class RemoveZeros {
    
    static int removeZeros(int[] a){
        int j =0;
        
        for(int i =0;i<a.length;i++) {
            if(a[i] !=0) {
                a[j] = a[i];
                j++;
            }
            
        }
        
        return j;
    }
    public static void main(String[] args) {
        int[] a = new int[]{0, 5, 6, 0, 0, 2, 5};
        int val = removeZeros(a);
        for(int i =0;i<val;i++)
            System.out.println(a[i]);
    }
}

答案 6 :(得分:0)

您可以使用Vector

Vector vec = new Vector();
for (int i=0; i<array.length; i++){
   if (array[i] != 0)
      vec.add(array[i]);
}
vec.toArray()

(这不是确切的语法,但你明白了。)

答案 7 :(得分:0)

如果你被允许使用List而不是数组,你实际上除了创建一个新的Iteratable接口并且像google-collections Collections2.filter()那样应用一个方法之外什么都可以做,你可以检查它。

答案 8 :(得分:0)

您使用的编程语言是否使用.map或.reduce函数,或者是否有允许您执行此操作的扩展名?

在Swift中,您可以通过.filter执行此操作;观察

var orders = [0, 5, 6, 0, 0, 2, 5]

orders = orders.filter({ $0 != 0 })

print (orders)

这会返回[5, 6, 2, 5],保留您的订单

答案 9 :(得分:0)

尝试基本方法:

public int[] convert(int[] data) {
    int count =0;
    for (int i =0; i< data.length; i++) {
        if(data[i]==0)
            count++;
    }
    int[] nonZero = new int[data.length-count];
    int j =0;
    for(int i = 0; i<data.length; i++) {
        if(data[i]!=0) {
            nonZero[j] = data[i];
            j++;
        }
    }
    return nonZero;
}