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

时间:2019-04-02 00:21:31

标签: java arrays int java-stream

我有一个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);

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

  

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

我的问题是:

  1. 我如何实现我的目标?
  2. 为什么我不能像过滤int数组那样过滤String数组?

3 个答案:

答案 0 :(得分: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>。然后,使用toArray()类中的Stream将调用this版本,该版本接受IntFunction,它将转换为特定类型的Array。 (不接受来自toArray()的参数的Stream方法将返回Object[]

答案 1 :(得分:1)

我们知道,原始类型不是Java中的对象,因为它们在go env类中有重载的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); } 类调用泛型stream方法并生成Arrays,现在Stream<T>接口有两个重载的Stream。 如果我们使用

  1. toArray()然后产生toArray(),在这种情况下,我们需要种姓。
  2. Object[]然后给我们toArray(IntFunction<A[]> generator),其中A[]是任何引用类型。

请参见下面的示例

A

}

答案 2 :(得分:0)

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

IF OBJECT_ID('tempdb..##SourceValues') IS NOT NULL
    DROP TABLE ##SourceValues
DECLARE @Schema VARCHAR(50) = 'SomeSchema'
DECLARE @Table VARCHAR(50) = 'SomeTable'
DECLARE @WhereClause VARCHAR(MAX) = ' Some WHERE clause'
DECLARE @ColumnName VARCHAR(50)
DECLARE @ProcessedRows TABLE(ColumnName VARCHAR(50), DistinctCount INT)
DECLARE @Columns TABLE(RowNumber INT,  ColumnName VARCHAR(100)) 
INSERT INTO @Columns SELECT ROW_NUMBER() OVER(ORDER BY COLUMN_NAME DESC),  COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @Table
DECLARE @Count INT = (SELECT MAX(RowNumber) FROM @Columns)
DECLARE @Counter INT = 0
DECLARE @DistinctCount INT 
DECLARE @Query NVARCHAR(MAX)
EXEC('SELECT * INTO ##SourceValues FROM ' + @Table +' (NOLOCK)')
WHILE @Counter < @Count
BEGIN 
    SET @Counter += 1
    SET @ColumnName = (SELECT ColumnName FROM @Columns WHERE RowNumber = @Counter)
    SET @Query = 'SELECT @OutPut = COUNT(' + @ColumnName + ') FROM ' + @Schema + '.' + ' ##SourceValues ' + @WhereClause
    EXECUTE sp_executesql @Query, N'@Output INT OUT', @DistinctCount OUT
    INSERT INTO @ProcessedRows(ColumnName, DistinctCount) VALUES (@ColumnName, @DistinctCount)
END
SELECT * FROM @ProcessedRows