如何展平数组并摆脱空?

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)

Tun*_*aki 6

使用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).