Использование потока для получения результатов по столбцу в двумерном массиве - PullRequest
0 голосов
/ 05 октября 2019

Я полный новичок в потоке API, и я хочу выполнить некоторую операцию с двумерным массивом

Следующий код является упрощенной версией того, что я хочу сделать.

У меня есть массив значений:

int values[][] = new int[][] {{1,2},{3,4},{5,6}};

Я хотел бы обработать значения для каждого столбца и получить

int result[] = {x,y}

Например, если я сделаю сумму, он должен получить меня

result[] = {9, 12}

Спасибо заранее за вашу помощь

Ответы [ 2 ]

2 голосов
/ 05 октября 2019

Попробуйте это.

      int values[][] = new int[][] { { 1, 2
            }, { 3, 4
            }, { 5, 6
            }
      };
      int[] v = Arrays.stream(values).reduce(new int[] { 0, 0
      }, (a, b) ->
      {
         a[0] += b[0];
         a[1] += b[1];
         return a;
      });
      System.out.println(Arrays.toString(v));

РЕДАКТИРОВАТЬ:

Относительно вашего другого вопроса о размещении различного количества столбцов. Да, ты можешь сделать это. Но только потому, что вы можете, не означает, что вы должны или что это лучший способ. Далее следует простой метод, который суммирует целые числа в любом двумерном массиве независимо от длины строки. Он даже обрабатывает рваные массивы. Обратите внимание, что это суммирует столбцы «первым пришел - первым обслужен», так как они обрабатываются так, как будто они выровнены по левому краю относительно друг друга.

Инициализируйте неправильный (рваный или разной длины строки) массив

      int values[][] = new int[][] { { 1
            }, { 20, 3
            }, { 1, 2, 4
            }, { 3, 4, 10
            }, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
            }
      };

Теперь вычислите сумму, используя следующий метод.

   public static int[] sumColumns(int[][] vals) {
      // compute the maximum row length (most columns)
      int maxColumns = 0;
      for (int r = 0; r < vals.length; r++) {
         maxColumns = Math.max(maxColumns, vals[r].length);
      }

      // use that to initialize the return array
      int[] sums = new int[maxColumns];

      //now just iterate over the rows and columns
      // calculating the sum.  
      for (int r = 0; r < vals.length; r++) {
         for (int c = 0; c < vals[r].length; c++) {
            sums[c] += vals[r][c];
         }
      }
      return sums;
   }

Чтобы сделать любую прямоугольную матрицу с потоками, сделайте следующее:

           int[] result2 =
               Arrays.stream(values).reduce(new int[values[0].length], (a, b) ->
            {
               for (int i = 0; i < values[0].length; ++i) {
                  a[i] += b[i];
               }
               return a;
            });
0 голосов
/ 05 октября 2019

Мой вопрос был недостаточно точным (извините за мой плохой уровень владения английским).

В первом примере с потоком он основывался на том факте, что в каждой строке было 2 значения. В моем случае у меня всегда будут одинаковые номера столбцов, но я не знаю, сколько во время кодирования.

Итак, как будет изменяться код с переменной «size»?

int values[][] = new int[][] {
            {1,2,3},
            {4,5,6},
            {7,8,9}
    };

    int size = 3;
    int[] result2 = Arrays.stream(arr)
            .reduce(new int[size],
                    (a, b) -> new int[] { a[0] + b[0], a[1] + b[1] });
    System.out.println(Arrays.toString(result2));

Я гораздо больше сосредоточен на части кода "a [0] + b [0]"

РЕДАКТИРОВАТЬ: Я наконец-то получил что-то, но я, хотя я мог бы обойтись без цикла for:

int values[][] = new int[][] {
            {1,2,3},
            {4,5,6},
            {7,8,9}
    };

    int size = 3;
    int[] result2 = Arrays.stream(values)
            .reduce(new int[size],
                    (a, b) -> {
                    int[] myInt = new int[size];
                    for (int i =0; i < size ; ++i) {
                        myInt[i] = a[i] + b[i];
                    }
                    return myInt;
            });
    System.out.println(Arrays.toString(result2));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...