2016-09-05 2 views

ответ

2

Более прямой версии. Мы складываем список, используя карту в качестве аккумулятора. withDefaultValue означает, что нам не нужно проверять, есть ли у нас запись на карте.

val xs = List(('a',3),('b',3),('a',1)) 

xs.foldLeft(Map[Char, Int]() withDefaultValue 0) 
      {case (m, (c, i)) => m updated (c,m(c)+i)} 

//> res0: scala.collection.immutable.Map[Char,Int] = Map(a -> 4, b -> 3) 
+0

Хорошо, один вопрос: когда я копирую ваш код непосредственно на рабочий лист, он работает, но когда я это делаю: 'List (('a', 3), ('b', 3), ('a', 1)) foldLeft (Map [Char, Int]() withDefaultValue 0) {case (m, (c, i)) => m updated (c, m (c) + i)} 'он дает мне ошибку, говоря, что' updated': невозможно разрешить символ. Это нормально, когда я помещаю '.' между List (......). FoldLeft (.......), но без него у компилятора есть проблемы. –

+0

Приоритет проблема, думаю. Parens вокруг '(list foldleft Map ...)' также исправляет его. –

1
list.groupBy(_._1).mapValues(_.map(_._2).sum) 

, который может быть записан в виде

list.groupBy(_._1).mapValues { tuples => 
    val ints = tuples.map { case (c, i) => i } 
    ints.sum 
} 
+0

Это, вероятно, самый простой способ сделать это, но он собирается создать кучу посторонней 'Lists', а также требует дополнительной итерации через значение, связанное с каждым ключом для получения суммы. –

+0

@JasonLenderman, что вы предлагаете? 'View'? Я тоже учусь. –

+0

, добавляя '.view' в' list', производит тот же вывод и порождает 'SeqView *' в процессе, который, я думаю, является легким. –

Смежные вопросы