簡體   English   中英

求和Java中隨機嵌套數組的基本元素?

[英]Sum the base elements of a randomly nested array in Java?

給定一個多維整數數組,如何找到所有基本元素的總和? 每個數組中可能有不同數量的數組,因此我的算法必須靈活以容納所有可能的輸入。 遞歸方法似乎是最優雅的解決方案。 例:

鑒於:

array = {
   {{1,2,3},
   {4,5},
   {6,7,8}},
   {{9},{10}}
}

回程55

請注意,每個子陣列的長度都是不一致的,並且隨着陣列的深度而變化。 這意味着傳統的循環將無法檢查數組的長度,而遞歸方法將無法將循環具有的維數定義為初始參數。 也許遞歸循環需要將一個Object為數組?


編輯:

該方法還應該能夠對任意數量的維數組求和。 例如,輸入數組可以具有3個維度,甚至7個維度。

使用Java Streams,您可以只使用此方法(假設您的數組有2個維度):

int[][] array = {{1, 2, 3}, {4, 5}, {6, 7, 8}, {9, 10}};
int sum = Arrays.stream(array)
        .flatMapToInt(Arrays::stream)
        .sum();

如果數組具有3個維度,則可以將其擴展為以下內容:

int[][][] array = {{{1, 2, 3}, {4, 5}, {6, 7, 8}}, {{9}, {10}}};
int sum = Arrays.stream(array)
        .flatMap(Arrays::stream)
        .flatMapToInt(Arrays::stream)
        .sum();

要處理深度未知的數組,可以使用以下方法展平它們:

private static Stream<Object> flatMapDynamicArray(Object[] array) {
    return Arrays.stream(array)
            .flatMap(o -> o.getClass().isArray() ? 
                    flatMapDynamicArray((Object[]) o) : 
                    Stream.of(o));
}

您也可以使用o instanceof Object[]代替o.getClass().isArray()但對於我的測試,第二o.getClass().isArray()更好。

像這樣使用這種方法:

Integer[][][] array = {{{1, 2, 3}, {4, 5}, {6, 7, 8}}, {{9}, {10}}};
int sum = flatMapDynamicArray(array)
        .mapToInt(i -> (int) i)
        .sum();

在所有情況下,您共享的陣列的結果均為55

不使用流或lambda的另一種可能性是編寫一種簡單的遞歸方法。 就像其他這種性質的一樣,類型沖突只會在運行時出現。

對於以下嵌套數組結構:

      Integer[][][][] array = { { { { 1, 2, 3
            }, { 4, 5, 6
            }, { 7, 8, 9
            }
            }, { { 10, 11, 12,
            }, { 13, 14, 15
            }, { 16, 17, 19
            }
            }
            }, { { { 20, 21, 22
            }, { 23, 24, 25
            }
            }
            }
      };

   System.out.println(sum(array));

   public static int sum(Object[] a) {
      int sum = 0;
      for (Object o : a) {
         if (o instanceof Object[]) {
            sum += sum((Object[]) o);
         }
         if (o instanceof Integer) {
            sum += (Integer) o;
         }
      }
      return sum;
   }

打印

307

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM