2012-01-08 5 views
11

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

[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++; 
      } 
     } 

Я не смог найти какой-либо метод в классе Массивы и Google/SO поиски не дали мне какие-нибудь хорошие ответы.

+5

Самое простое решение, чтобы избежать добавления их в первую очередь. –

+1

Вам нужен новый массив с новой длиной, поэтому вам все равно придется делать копию. Работа с коллекцией избавит вас от необходимости находить конечный размер спереди. –

+0

Мое положение: массив - это доска, игра.Существует много возможностей, когда в одном или нескольких отверстиях нет предметов. Итак, нули будут там, вот почему я спрашиваю ... – Hidde

ответ

13

Это один из тех редких случаев, когда это проще показать это в коде, чем объяснить на простом английском языке:

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

Но тогда вы заканчиваете 'Integer []', а не 'int []' – Robin

+2

@Robin Нет, вы этого не делаете. Как так? –

+0

Производительность на самом деле не проблема, я искал более короткие способы написать выше. Мне нравится ArrayLists, но я надеюсь, что будет более короткий путь, просто используя массивы. – Hidde

0

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

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

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

+0

Я предпочитаю использовать ArrayList, поскольку он использует generics. –

+0

@MartijnCourteaux Vector также использует генерики ... – AlanFoster

+0

@MartijnCourteaux 'Vector' также может использовать дженерики. Есть гораздо лучшие причины для выбора «ArrayList» вместо «Vector» (см., Например, [этот вопрос в SO] (http://stackoverflow.com/questions/2986296/what-are-the-differences-between -arraylist-and-vector)) – Robin

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 экземплярами, а не с 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()]); 
+0

Вид дубликата ответа Майка. – Hidde

+0

Yups, хотя его нет в его оригинальной версии, и это был единственный, который я видел перед тем, как начать с этого ответа. – Robin

9

Как о это:

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] 
+0

Это отличная альтернатива. – Hidde

+0

Я понял большую часть этого ответа, за исключением строки 'numbers = list.toArray (новый Integer [0]);', что делает 'new Integer [0]' help in? Я понимаю, что он инициализирует новый массив Integer с размером 0, но как он помогает? –

0

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

1

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

    } 
} 
+0

Apache commons lang 3.5 теперь содержит removeAllOccurences (T [] array, T element), который делает именно то, что хочет OP, и что вы предложили, но без необходимости цикла. – GriffinG

+0

Эй, спасибо за информацию. Я рад получить эти знания от вас! –

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], сохраняя ваш заказ

+0

Возможно, язык программирования, который вы используете, имеет библиотеку поддерева или Lo-Dash – zardon

Смежные вопросы