gpt4 book ai didi

java - 如何展平数组并消除 null?

转载 作者:行者123 更新时间:2023-12-01 07:02:57 25 4
gpt4 key购买 nike

我正在尝试获取任意深度嵌套的数组并展平该数组,并删除数组中的任何空对象。

例如,我希望能够输入一个嵌套数组,例如[1, 5, [[6, 4], 91, 12, null, [[null]]], -2]并返回一个没有任何空值的一维数组。我该如何解决这个问题?

我在下面提供了我的解决方案,但我不断收到

I cannot be cast to java.lang.Integer error.

public static void main(String[] args) {
int[][] numbers = {null, {4, 5, 6},{3, 1, 10}, {4, 2, 9}, null, null};
flatten(numbers);
}

public static ArrayList<Integer> flatten(Object[] nestedNumbers) {
if (nestedNumbers == null) return null;
ArrayList<Integer> flattenedNumbers = new ArrayList<>();
for (Object element : nestedNumbers) {
if (element != null) {
flattenedNumbers.add((Integer)element);
}
}
return flattenedNumbers;
}

最佳答案

使用 Stream API 的可能解决方案Java 8 中引入的内容如下:

public static int[] flatten(Object[] array) {
return Arrays.stream(array)
.filter(Objects::nonNull)
.flatMapToInt(a -> {
if (a instanceof Object[]) return Arrays.stream(flatten((Object[]) a));
return Arrays.stream((int[]) a);
})
.toArray();
}

首先要考虑的是 int[]不是Object[] 。所以,这个方法接受 Object[]表示可以给定任何类型的至少具有 2 维的整数数组,即 int[][] ,直到任意数量的维度。它用 Objects::nonNull 过滤掉空元素。谓词。

然后奇迹发生了:Stream<Object> ,返回者 Arrays.stream(array) ,平面映射到 IntStream :如果里面的元素是Object[] ,那么这意味着我们仍然有超过 2 个维度,并且该方法正在递归调用自身。另一方面,如果我们有一个 int[] 的实例,然后我们可以用它的 Stream 替换它。

调用代码示例:

public static void main(String[] args) {
int[][][] numbers = {null, {{4}, {5}, {6,1}},{{3,2}, {1}, {10}}, {{4,1}, {2,3}, {9,8}}, null, null};
int[] flat = flatten(numbers);
System.out.println(Arrays.toString(flat));
}

当然,这个方法不接受 int[] ,这就是没有什么可以展平的情况(也没有什么可以过滤的,因为 int 不能是 null )。

关于java - 如何展平数组并消除 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36413675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com