Учитывая многомерный массив целых чисел, как я могу найти сумму всех базовых элементов? В каждом массиве может быть разное количество массивов, поэтому мой алгоритм должен быть гибким, чтобы учитывать все возможные входные данные. Рекурсивный метод кажется наиболее элегантным решением. Пример:
Дано:
array = {
{{1,2,3},
{4,5},
{6,7,8}},
{{9},{10}}
}
Вернуть:
55
Обратите внимание, что длина каждого подмассива непостоянна и варьируется, как и глубина массива. Это означает, что традиционные циклы не смогут проверить длину массива, а рекурсивные методы не смогут определить количество измерений цикла в качестве начального параметра. Возможно, рекурсивный цикл должен был бы преобразовать Object в виде массива?
Редактировать:
Метод также должен иметь возможность суммировать массив ЛЮБОГО количества измерений. Например, входной массив может иметь три измерения или даже 7.




Используя потоки Java, вы можете использовать только это (при условии, что ваш массив имеет 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(), но для моих тестов у второго было лучше.
Используйте этот метод следующим образом:
Integer[][][] array = {{{1, 2, 3}, {4, 5}, {6, 7, 8}}, {{9}, {10}}};
int sum = flatMapDynamicArray(array)
.mapToInt(i -> (int) i)
.sum();
Результатом во всех случаях будет 55 для массива, которым вы поделились.
Что делать, если вы не знаете, сколько измерений будет иметь родительский массив?
Итак, у вас есть Object в качестве входных данных?
Да, Object будет вводом, если это необходимо.
@FrankFanelli Я отредактировал свой вопрос. Надеюсь, это поможет справиться с массивами с неизвестной глубиной.
Мы можем использовать o.getClass().isArray() вместо o instanceof Object[].
@OmidNejadabbasi Да, спасибо, что заметили. Я проверил это и обновил свой ответ в соответствии с этим.
Другая возможность, не использующая потоки или лямбда-выражения, — написать простой рекурсивный метод. Как и другие подобные конфликты, конфликты типов проявляются только во время выполнения.
Для следующей структуры вложенного массива:
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
предоставить вывод того, что вы ожидаете от приведенного выше ввода