如何从 int 数组 (Java) 中删除空元素?
How to remove null element from int array (Java)?
我有一个包含元素 0
的 int
数组。我想删除这些元素并减小数组的大小。
我在 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);
不幸的是,我收到一个错误:
The method toArray()
in the type IntStream
is not applicable for the arguments (int[]::new)
我的问题是:
- 我怎样才能实现我的目标?
- 为什么我不能像过滤
String
数组一样过滤我的 int
数组?
对于原始 int[]
不要向 toArray()
提供参数:
in1 = Arrays.stream(in1).filter(x -> x != 0).toArray();
另请注意,您没有再次在 in1
前添加 int[]
,因为您已经定义了变量 in1
它与另一个问题的工作方式不同的原因是 Arrays.stream(int[])
returns an IntStream
which has a version of toArray()
其中 returns 和 int[]
.
使用
Arrays.stream(new String[]{"This","", "will", "", "", "work"})
将调用 Arrays.stream(T[] array)
,其中:
Returns a sequential Stream
with the specified array as its source.
或Stream<String>
。然后使用 Stream
class 中的 toArray()
将调用 this 版本,该版本接受 IntFunction
,这会将其转换为特定类型的 Array
. (toArray()
方法不接受来自 Stream
returns 和 Object[]
的参数)
这可能不是您能找到的最佳版本,但是:
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;
}
正如我们所知,基本类型在java中不是对象,Arrays
class中为它们重载了stream()
方法。假设这里只考虑int
。如果我们传递 int[]
然后 stream(int[] array)
被调用和 returns IntStream
对象。
如果你去看看 IntStream
class 那么你会发现只有一个 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
class 调用泛型 stream
方法并生成 Stream<T>
,现在 Stream
接口有两个重载toArray()
。
如果我们使用
toArray()
然后让步 Object[]
,在这种情况下我们需要种姓。
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
的 int
数组。我想删除这些元素并减小数组的大小。
我在 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);
不幸的是,我收到一个错误:
The method
toArray()
in the typeIntStream
is not applicable for the arguments(int[]::new)
我的问题是:
- 我怎样才能实现我的目标?
- 为什么我不能像过滤
String
数组一样过滤我的int
数组?
对于原始 int[]
不要向 toArray()
提供参数:
in1 = Arrays.stream(in1).filter(x -> x != 0).toArray();
另请注意,您没有再次在 in1
前添加 int[]
,因为您已经定义了变量 in1
它与另一个问题的工作方式不同的原因是 Arrays.stream(int[])
returns an IntStream
which has a version of toArray()
其中 returns 和 int[]
.
使用
Arrays.stream(new String[]{"This","", "will", "", "", "work"})
将调用 Arrays.stream(T[] array)
,其中:
Returns a sequential
Stream
with the specified array as its source.
或Stream<String>
。然后使用 Stream
class 中的 toArray()
将调用 this 版本,该版本接受 IntFunction
,这会将其转换为特定类型的 Array
. (toArray()
方法不接受来自 Stream
returns 和 Object[]
的参数)
这可能不是您能找到的最佳版本,但是:
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;
}
正如我们所知,基本类型在java中不是对象,Arrays
class中为它们重载了stream()
方法。假设这里只考虑int
。如果我们传递 int[]
然后 stream(int[] array)
被调用和 returns IntStream
对象。
如果你去看看 IntStream
class 那么你会发现只有一个 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
class 调用泛型 stream
方法并生成 Stream<T>
,现在 Stream
接口有两个重载toArray()
。
如果我们使用
toArray()
然后让步Object[]
,在这种情况下我们需要种姓。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);
}
}
}