Как обновить элементы внутри ArrayList ArrayLists of Integers, используя карту потока и уменьшить?

avatar
AetherRemnant
1 июля 2021 в 18:57
118
3
-2

По сути, у меня ArrayList<ArrayList<Integer>> = [[-1,-4], [3,2], [0,-4], [-3,2]. Я хочу использовать потоки для прохождения каждого ArrayList и добавления элементов вместе, например: [[-5],[5],[-4], [-1]]. Затем я хочу преобразовать его в массив int[] и получить следующее: [-5, 5, -4, -1].

У меня есть это:

ArrayList<ArrayList<Integer>> outerNums = new ArrayList<ArrayList<Integer>>();
        ArrayList<Integer> innerNums0 = new ArrayList<>();
        ArrayList<Integer> innerNums1 = new ArrayList<>();
        ArrayList<Integer> innerNums2 = new ArrayList<>();
        ArrayList<Integer> innerNums3 = new ArrayList<>();
        innerNums0.add(-1);
        innerNums0.add(-4);
        innerNums1.add(3);
        innerNums1.add(2);
        innerNums2.add(0);
        innerNums2.add(-4);
        innerNums3.add(-3);
        innerNums3.add(2);
        //
        outerNums.add(innerNums0);
        outerNums.add(innerNums1);
        outerNums.add(innerNums2);
        outerNums.add(innerNums3);
        
        
        
        System.out.println(res(outerNums));
    }
    
    public static int[] res(ArrayList<ArrayList<Integer>> innerNums) {
        
        System.out.println(innerNums);
        //Need to use both map and reduce
        int[] result = innerNums.stream().map().reduce(); //not sure what to do here.
        
        return result;
        
    }
Источник

Ответы (3)

avatar
Tim Hunter
1 июля 2021 в 19:41
1

Полагаю, что-то вроде этого вы ищете?

List<List<Integer>> list = List.of(List.of(-1,-4), List.of(3,2), List.of(0,-4), List.of(-3,2));
int[] result = list.stream()
  .map(innerList -> innerList.stream().reduce(0, Integer::sum))
  .mapToInt(Integer::intValue)
  .toArray();
System.out.println(Arrays.toString(result));

Вывод

[-5, 5, -4, -1]
AetherRemnant
1 июля 2021 в 19:44
0

Да это оно. Благодарю вас!

Tim Hunter
1 июля 2021 в 20:07
1

@AetherRemnant Примечание: вы можете уменьшить это, просто используя mapToInt напрямую вместо использования метода map... int[] result = list.stream().mapToInt(innerList -> innerList.stream().reduce(0, Integer::sum)).toArray();

avatar
Unmitigated
1 июля 2021 в 19:04
4

Вы можете использовать IntStream#sum.

innerNums.stream().mapToInt(x -> x.stream().mapToInt(i -> i).sum()).toArray();

Демо

avatar
user7
1 июля 2021 в 19:04
1

Для каждого внутреннего списка выполните потоковую обработку и суммирование перед сбором сумм в массив.

int[] result = outerNums.stream()
        .mapToInt(innerArrayList -> innerArrayList.stream()
                .mapToInt(i -> i)
                .sum())
        .toArray();

Примечание: mapToInt возвращает IntStream.