Преобразовать список [(Int, String)] в список [Int] в Scala - PullRequest
0 голосов
/ 02 июня 2018

Моя цель - сопоставить каждое слово в тексте (индекс, строка) со списком, содержащим индексы каждой строки, в которой встречается слово. Мне удалось написать функцию, которая возвращает список всех слов, присвоенных индексу,

Следующая функция должна делать все остальное (отобразить список индексов для каждого слова):

def mapIndicesToWords(l:List[(Int,String)]):Map[String,List[Int]] = ???

Если я сделаю это:

l.groupBy(x => x._2)

, она возвращаетMap[String, List[(Int,String)].Теперь я просто хочу изменить значение на List[Int].Я подумал об использовании .mapValues(...) и каким-то образом свернуть список, но я новичок в scala и не знаю правильного подхода для этого.

Так как мне преобразовать список?

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Также вы можете использовать foldLeft, вам нужно просто указать аккумулятор (в вашем случае Map [String, List [Int]]), который будет возвращен в результате, и написать некоторую логику внутри.Вот моя реализация.

def mapIndicesToWords(l:List[(Int,String)]): Map[String,List[Int]] =
  l.foldLeft(Map[String, List[Int]]())((map, entry) =>
    map.get(entry._2) match {
      case Some(list) => map + (entry._2 -> (entry._1 :: list))
      case None => map + (entry._2 -> List(entry._1))
    }
  )

Но с foldLeft элементы списка будут в обратном порядке, так что вы можете использовать foldRight.Просто измените foldLeft на foldRight и поменяйте местами входные параметры, от (map, entry) до (entry, map).

И будьте осторожны, foldRight работает в 2 раза медленнее.Это реализовано с использованием метода reverse list и foldLeft.

0 голосов
/ 03 июня 2018
scala> val myMap: Map[String,List[(Int, String)]]  = Map("a" -> List((1,"line1"), (2, "line")))
myMap: Map[String,List[(Int, String)]] = Map(a -> List((1,line1), (2,line)))

scala> myMap.mapValues(lst => lst.map(pair => pair._1))
res0: scala.collection.immutable.Map[String,List[Int]] = Map(a -> List(1, 2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...