2016-07-11 5 views
0

У меня есть следующие переменнойУменьшают Список Карта кортежей

val x1 = List((List(('a',1), ('e',1), ('t',1)),"eat"), (List(('a',1), ('e',1), ('t',1)),"ate")) 

Я хочу, чтобы получить

List(Map -> List) 

, который будет выглядеть примерно следующим образом. Идея заключается в том, чтобы сгруппировать слова б символы, содержащиеся в них

Map(List((a,1), (e,1), (t,1)) -> List(eat, ate)) 

Я использовал следующее для достижения этой цели, однако, не совсем получить это право. Я использовал следующий код и получить ожидаемый результат

scala> val z1 = x1.groupBy(x => x._1) 
        .map(x => Map(x._1 -> x._2.map(z=>z._2))) 
        .fold(){(a,b) => b} 
z1: Any = Map(List((a,1), (e,1), (t,1)) -> List(eat, ate)) 

Однако, я хотел бы вернуться очевидный тип Map[List[(Char, Int)],List[String]] и не Any, как возвращается в моем случае. Кроме того, мне интересно, лучше ли все это делать сама. Большое спасибо!

ответ

1

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

scala> x1.groupBy(_._1).mapValues(_.map(_._2)) 
res2: scala.collection.immutable.Map[List[(Char, Int)],List[String]] = Map(List((a,1), (e,1), (t,1)) -> List(eat, ate)) 

Но, я думаю, вы можете пересмотреть свое представление данных. То, что List[(List[(Char,Int)], String)] бизнес довольно громоздкий.

+0

Спасибо! Работал как шарм! Об этом представлении данных, 'List [(Список [(Char, Int)], String)]' вычисляется из словаря разных слов. – borarak

+0

Вы можете использовать следующую канонизацию: 'val words = List (" eat "," ate "," cheap "," peach "," tree ") words.map (w => (w.toLowerCase.sorted .., ш)) GroupBy (_._ 1) .mapValues ​​(_ карта (_._ 2)) ' Это дает: ' Карта (AET -> Список (есть, ели), acehp -> Список (дешево, персик), eert -> Список (дерево)) ' – Iadams