Как удалить нулевой элемент из массива int (Java)? - PullRequest
2 голосов
/ 02 апреля 2019

У меня есть массив int с элементами 0.Я хочу удалить эти элементы и уменьшить размер моего массива.

Я прочитал пример массива String в Удаление пустого элемента из массива (Java) и применил его к моему случаю:

int[] in1 = {0, 0, 2, 0, 3};
int[] in1 = Arrays.stream(in1).filter(x -> x != 0).toArray(int[]::new);

К сожалению, я получаю сообщение об ошибке:

Метод toArray() в типе IntStream не применим для аргументов (int[]::new)

Мои вопросы:

  1. Как мне достичь своей цели?
  2. Почему я не могу отфильтровать массив int так же, как Stringмассив?

Ответы [ 3 ]

4 голосов
/ 02 апреля 2019

Для примитива int[] не указывайте аргументы для toArray():

in1 = Arrays.stream(in1).filter(x -> x != 0).toArray();

Также обратите внимание, что вы не добавляете префикс in1 к int[] снова, поскольку вы уже определилипеременная in1

Причина, по которой он не работает так же, как и в другом вопросе, заключается в том, что Arrays.stream(int[]) возвращает IntStream с версией toArray(), который возвращает int[].

Использование

Arrays.stream(new String[]{"This","", "will", "", "", "work"})

вызовет Arrays.stream(T[] array), что:

Возвращает последовательный Stream с указанным массивом в качестве источника.

Или Stream<String>.Тогда использование toArray() из класса Stream вызовет эту версию, которая принимает IntFunction, которая преобразует его в определенный тип Array.(Метод toArray(), который не принимает аргументов из Stream, возвращает Object[])

1 голос
/ 02 апреля 2019

Как мы знаем, примитивные типы не являются объектами в java, для них есть перегруженный stream() метод в Arrays классе.Предположим, здесь просто рассмотрим int.Если мы передадим int[], тогда stream(int[] array) получит вызов и вернет IntStream объект.Если вы пойдете и увидите класс IntStream, то найдете только один метод toArray, который не принимает никаких аргументов.

Итак, мы не можем сделать toArray(int[]::new).

int[] in1 = {0, 0, 2, 0, 3}; int[] in2 = Arrays.stream(in1).filter(x -> x != 0).toArray();

Но для любого массива ссылочного типа мы можем преобразовать его в определенный тип.например,

String[] str2 = {"a","b",null,"c"};
    String[] strArr = Arrays.stream(str2).filter(i -> !=null).toArray(String[]::new);
    for (String string : strArr) {
        System.out.println(string);
    }

В случае типа Reference общий метод stream вызывается из класса Arrays и выдает Stream<T>, теперь интерфейс Stream имеет два перегруженных toArray().Если мы используем

  1. toArray(), то получим Object[], в этом случае нам нужно кастовать.
  2. toArray(IntFunction<A[]> generator), тогда дайте нам A[], где Aлюбой тип ссылки.

См. пример ниже

package test;
import java.util.Arrays;
public class EliminateZeroFromIntArray {
public static void main(String[] args) {

    int[] in1 = {0, 0, 2, 0, 3};
    int[] in2 = Arrays.stream(in1).filter(x -> x != 0).toArray();
    for (int i : in2) {
        System.out.println(i);
    }

    String[] str = {"a","b",null,"c"};
    Object[] array = Arrays.stream(str).filter(i -> i !=null).toArray();

    for (Object object : array) {
        System.out.println((String)object);
    }

    String[] str2 = {"a","b",null,"c"};
    String[] strArr = Arrays.stream(str2).filter(i -> i !=null).toArray(String[]::new);
    for (String string : strArr) {
        System.out.println(string);
    }
}

}

0 голосов
/ 02 апреля 2019

Возможно, это не лучшая версия, которую вы найдете, но:

private int[] removeZeros(int[] array, int toRemove)
    {
        int count = 0;
        int arrayLength = array.length;

        for (int i = 0; i < array.length; i++)
        {
            if (array[i] == toRemove)
                count++;
        }

        int[] newArray = new int[arrayLength - count];
        int j = 0;
        for (int i = 0; i < array.length; i++)
        {
            if (array[i] != toRemove)
            {
                newArray[j] = array[i];
                j++;
            }
        }
        return newArray;
    }
...