Удалить все нули из массива

У меня есть массив:

[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 не дали мне никаких хороших ответов.

Ответ 1

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

Ответ 2

Как насчет этого:

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]

Ответ 3

Вы можете добиться этого только одним контуром. Является ли это лучше или понятнее, это вопрос личного вкуса, которого я боюсь.

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, а не с int s

List<Integer> originalList = ....;
Iterator<Integer> iterator = originalList.iterator();
while ( iterator.hasNext() ) {
  Integer next = iterator.next();
  if ( next == 0 ){
    iterator.remove();
  }
}
//convert to array if needed
Integer[] result = originalList.toArray( new Integer[originalList.size()]);

Ответ 4

В этом примере используется библиотека 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);

    }
}

Ответ 5

Вы можете использовать Vector:

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

(это не точный синтаксис, но вы получаете идею..)

Ответ 6

Если вам разрешен список пользователей вместо массива, вы можете фактически ничего не делать, кроме создания нового интерфейса Iteratable и применять к нему метод, например google-collections Collections2.filter() делает, вы можете проверить это.

Ответ 7

Используется ли в используемом вами языке программирования функции .map или .reduce, или есть расширение, которое позволяет вам это делать?

В Swift вы можете сделать это через .filter; наблюдать

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

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

print (orders)

Это возвращает [5, 6, 2, 5], сохраняя ваш заказ