Ответ 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;
У меня есть массив:
[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 не дали мне никаких хороших ответов.
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;
Как насчет этого:
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]
Вы можете добиться этого только одним контуром. Является ли это лучше или понятнее, это вопрос личного вкуса, которого я боюсь.
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()]);
В этом примере используется библиотека 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);
}
}
Вы можете использовать Vector
:
Vector vec = new Vector();
for (int i=0; i<array.length; i++){
if (array[i] != 0)
vec.add(array[i]);
}
vec.toArray()
(это не точный синтаксис, но вы получаете идею..)
Если вам разрешен список пользователей вместо массива, вы можете фактически ничего не делать, кроме создания нового интерфейса Iteratable и применять к нему метод, например google-collections Collections2.filter() делает, вы можете проверить это.
Используется ли в используемом вами языке программирования функции .map или .reduce, или есть расширение, которое позволяет вам это делать?
В Swift вы можете сделать это через .filter; наблюдать
var orders = [0, 5, 6, 0, 0, 2, 5]
orders = orders.filter({ $0 != 0 })
print (orders)
Это возвращает [5, 6, 2, 5]
, сохраняя ваш заказ