如何从 int 数组 (Java) 中删除空元素?

How to remove null element from int array (Java)?

我有一个包含元素 0int 数组。我想删除这些元素并减小数组的大小。

我在 Removing empty element from Array(Java) 中阅读了 String 数组的示例并将其应用于我的案例:

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

不幸的是,我收到一个错误:

The method toArray() in the type IntStream is not applicable for the arguments (int[]::new)

我的问题是:

  1. 我怎样才能实现我的目标?
  2. 为什么我不能像过滤 String 数组一样过滤我的 int 数组?

对于原始 int[] 不要向 toArray() 提供参数:

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

另请注意,您没有再次在 in1 前添加 int[],因为您已经定义了变量 in1

它与另一个问题的工作方式不同的原因是 Arrays.stream(int[]) returns an IntStream which has a version of toArray() 其中 returns 和 int[].

使用

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

将调用 Arrays.stream(T[] array),其中:

Returns a sequential Stream with the specified array as its source.

Stream<String>。然后使用 Stream class 中的 toArray() 将调用 this 版本,该版本接受 IntFunction,这会将其转换为特定类型的 Array. (toArray() 方法不接受来自 Stream returns 和 Object[] 的参数)

这可能不是您能找到的最佳版本,但是:

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

正如我们所知,基本类型在java中不是对象,Arraysclass中为它们重载了stream()方法。假设这里只考虑int。如果我们传递 int[] 然后 stream(int[] array) 被调用和 returns IntStream 对象。 如果你去看看 IntStream class 那么你会发现只有一个 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);
    }

在引用类型的情况下,从 Arrays class 调用泛型 stream 方法并生成 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);
    }
}

}