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

3
我有一个包含元素为0int数组。我想要删除这些元素并减小数组的大小。
我阅读了一个关于String数组的例子,来自Removing empty element from Array(Java),并将其应用到我的情况中:
int[] in1 = {0, 0, 2, 0, 3};
int[] in1 = Arrays.stream(in1).filter(x -> x != 0).toArray(int[]::new);

很不幸,我收到了一个错误信息:

类型 IntStream 中的方法 toArray() 不适用于参数 (int[]::new)

我的问题是:

  1. 我该如何实现我的目标?
  2. 为什么我不能像过滤 String 数组一样过滤我的 int 数组?
3个回答

4

对于原始的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>。然后使用Stream类中的toArray()将调用这个版本,该版本接受一个IntFunction,将其转换为特定类型的Array。(从Stream中不带参数的toArray()方法返回一个Object[])


1
众所周知,在Java中,原始类型不是对象,因此在Arrays类中有重载的stream()方法。这里只考虑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);
    }

在引用类型情况下,从Arrays类调用通用的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);
    }
}

}


0

这可能不是你能找到的最好版本,但是:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接