为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

炎炎设计 2022-09-14 17:55:38
我有一个包含元素的数组。我想删除这些元素并减小数组的大小。int0我在从 Array(Java) 中删除空元素中阅读了数组的示例,并将其应用于我的情况:Stringint[] in1 = {0, 0, 2, 0, 3}; int[] in1 = Arrays.stream(in1).filter(x -> x != 0).toArray(int[]::new);很遗憾,我收到一个错误:类型中的方法不适用于参数toArray()IntStream(int[]::new)我的问题是:我怎样才能实现我的目标?为什么我不能像过滤数组一样过滤我的数组?intString
查看完整描述

3 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

对于基元,不要向 提供参数:int[]toArray()

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

另请注意,您不再使用前缀,因为您已经定义了变量in1int[]in1

它的工作方式与另一个问题不同的原因是,Arrays.stream(int[]) 返回了 一个具有 toArray() 版本的版本,该版本返回一个 .IntStreamint[]

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

将调用数组流(T[] 数组),它:

返回以指定数组作为其源的顺序。Stream

或 .然后使用来自类将调用版本,该版本接受 ,该版本会将其转换为特定类型的 .(不接受来自任何参数的方法返回Stream<String>toArray()StreamIntFunctionArraytoArray()StreamObject[])


查看完整回答
反对 回复 2022-09-14
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

众所周知,基元类型在java中不是对象,对于它们,类中有重载方法。假设这里只是考虑.如果我们通过,那么被调用并返回对象。如果你去看类,那么你会发现只有一个方法,它不接受任何参数。stream()Arraysintint[]stream(int[] array)IntStreamIntStreamtoArray

所以,我们不能做.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);
    }

在引用类型的情况下,泛型方法从类中被调用并产生,现在接口有两个重载。如果我们使用streamArraysStream<T>StreamtoArray()

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

}


查看完整回答
反对 回复 2022-09-14
?
青春有我

TA贡献1784条经验 获得超8个赞

这可能不是你会发现的最好的版本,但是:


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;

    }


查看完整回答
反对 回复 2022-09-14
  • 3 回答
  • 0 关注
  • 256 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信