] [0, 1, 0, 0, 0, 0, 1, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0]
0, 0, 0, 0, 0, 0, 0,
+ [0, 0, 0, 1, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, 0]
+ [0, 1, 0, 0, 0, 0, 1, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0]
= [0, 2, 0, 0, 1, 0, 0, 1, 0, 0, -3, -3, 0, 0, 1, 0, 1, 0, 0, 0]
Есть ли функция Java для выполнения вышеуказанной задачи или мне нужно перебирать все списки? Мой самый маленький список - около 3 тыс. Элементов, а средний - около 20 тыс.
вам понадобится как минимум 1 for
цикла, используя его индекс по всем массивам, в качестве result[i]=arr[i]+arr2[i]+....+arrn[i];
Если длина каждой переменной изменяется в каждом массиве, сначала вам нужно проверить, что вы находитесь в ее границах, прежде чем пытаться получить доступ к элементу.
Способ сделать это - использовать потоки Java 8. Я думаю, что функция reduce()
эквивалентна F # fold()
. Например:
public static void main(String[] args) {
List<List<Integer>> lists = new ArrayList<>();
lists.add(Arrays.asList(0, 1, 0, 0, 0, 0, 0, 1, 0, 0,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0));
lists.add(Arrays.asList(0, 0, 0,-1, 1, 0, 0, 0, 0, 0, 0,-1, 0, 0, 1, 0, 0, 0, 0, 0));
lists.add(Arrays.asList(0, 0, 0, 1, 0, 0, 0,-1, 0, 0,-1, 0, 0, 0, 0, 0, 1, 0, 0, 0));
lists.add(Arrays.asList(0, 1, 0, 0, 0, 0, 0, 1, 0, 0,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0));
int n = lists.get(0).size();
// Reduce each column to the sum of the elements in the column
// For example:
// i = 0 -> 0 + 0 + 0 + 0 = 0
// i = 1 -> 1 + 0 + 0 + 1 = 2
IntUnaryOperator sumElementsInPosition = i -> lists.stream()
.map(l -> l.get(i))
.reduce(0, (a, b) -> a + b);
// For each position i, map the position to the sum of elements in that position
List<Integer> sum = IntStream.range(0, n)
.map(sumElementsInPosition)
.boxed()
.collect(Collectors.toList());
System.out.println(sum);
}
Вывод:
[0, 2, 0, 0, 1, 0, 0, 1, 0, 0, -3, -3, 0, 0, 1, 0, 1, 0, 0, 0]
map()
, reduce()
, filter()
, Lambdas и куча других функциональных функций были введены в Java 8: docs.oracle.com/javase/8/docs/api/java/util/stream/Stream. HTML