Scala: Как суммировать все элементы с одинаковым индексом в списке списков разной длины? - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть список списков целых.Нужно получить список сумм всех элементов в столбце, идущих справа налево, с нулевым значением, если значение в столбце отсутствует (строка короче других):

            ( 1,  7),
    ( 3,  3,  6,  0),
                  (),
( 9,  1,  6,  7,  2),
                 ...
---------------------
( 9,  4,  9, 14,  9)

Iнаписал это на Java (скажем, императивный язык):

    int[][] s = {
                 { 1, 7 },
           { 3, 4, 6, 0 },
                       {},
        { 9, 1, 6, 7, 2 }
    };

    int maxLen = 0;
    for (int[] x : s) {
      maxLen = Integer.max(maxLen, x.length);
    }

    int[] sum = new int[maxLen];
    for (int j = maxLen; j-- > 0; ) {
      for (int[] i : s) {
        int idxFromEnd = j - maxLen + i.length;
        sum[j] += idxFromEnd >= 0 ? i[idxFromEnd] : 0;
      }
    }

и затем перевел на Scala:

  val s = List(
             List( 1, 7 ),
       List( 3, 4, 6, 0 ),
                   List(),
    List( 9, 1, 6, 7, 2 ),
  )

  val maxLen = s.view.map(_.length).max
  val sum =
    for (i <- 0 until maxLen)
    yield s.view.map(row => {
      val idxFromEnd = i - maxLen + row.length
      row.lift(idxFromEnd).getOrElse(0)
    }).sum

Не могли бы вы, ребята, предложить идиоматический способ написать это на Scala.Хвостовая рекурсия также допустима.

...