D.K*_*han 0 java arrays null arraylist object
我试图采取任意深度嵌套的数组并展平数组,以及摆脱数组中的任何空对象.
例如,我希望能够输入一个嵌套数组,
[1, 5, [[6, 4], 91, 12, null, [[null]]], -2]
并返回一个没有任何空值的一维数组.我该如何解决这个问题?
我在下面提供了我的解决方案,但我一直在寻找
我无法转换为java.lang.Integer错误.
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;
}
Run Code Online (Sandbox Code Playgroud)
使用Java 8中引入的Stream API的可能解决方案如下:
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();
}
Run Code Online (Sandbox Code Playgroud)
要考虑的第一点int[]是a不是Object[].所以,这个方法接受Object[]来表示,它可以给出任何类型整数数组的具有至少2个尺寸,即int[][],到任何数目的维度.它使用Objects::nonNull谓词过滤掉null元素.
然后,魔法发生:所述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));
}
Run Code Online (Sandbox Code Playgroud)
当然,这种方法不接受int[],这将是在那里没有什么变平(并没有什么过滤自遇int不可null).