【问题标题】:How to remove null element from int array (Java)?如何从 int 数组(Java)中删除空元素?
【发布时间】:2019-08-23 05:14:55
【问题描述】:

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

我在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);

很遗憾,我收到一个错误:

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

我的问题是:

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

【问题讨论】:

    标签: java arrays int java-stream


    【解决方案1】:

    我们知道,原始类型在 java 中不是对象,对于它们来说,Arrays 类中有重载的stream()method。假设这里只考虑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);
        }
    

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

    1. toArray() 然后yield 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);
        }
    }
    

    }

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        对于原始 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&lt;String&gt;。然后使用Stream 类中的toArray() 将调用this 版本,该版本接受IntFunction,将其转换为特定类型的Array。 (不接受来自Stream 的参数的toArray() 方法返回Object[]

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-18
          • 2019-11-28
          • 1970-01-01
          • 2022-01-13
          • 2018-08-06
          • 2013-01-26
          • 1970-01-01
          • 2017-06-15
          相关资源
          最近更新 更多