[英]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.