我有一个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)
我的问题是:
int
数组那样过滤String
数组?答案 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"})
返回以指定数组为源的顺序
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
。
如果我们使用
toArray()
然后产生toArray()
,在这种情况下,我们需要种姓。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