繁体   English   中英

在scala中将List [(Int,String)]转换为List [Int]

[英]Convert List[(Int,String)] into List[Int] in scala

我的目标是将文本(索引,行)中的每个单词映射到包含该单词所在的每一行的索引的列表。我设法编写了一个函数,该函数返回分配给索引的所有单词的列表。

其余功能应由以下功能完成(将索引列表映射到每个单词):

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

如果我这样做:

l.groupBy(x => x._2)

它返回一个Map[String, List[(Int,String)] 现在,我只想将值更改为List[Int] 我曾考虑过使用.mapValues(...)并以某种方式折叠列表,但是我是scala的新手,并且不知道正确的方法。

那么如何转换列表?

您也可以使用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时,list的元素将以相反的顺序排列,因此可以使用foldRight。 只需将foldLeft更改为foldRight,然后将输入参数(map, entry)交换为(entry, map)

请注意,foldRight的运行速度慢了2倍。 它是使用方法反向列表和foldLeft实现的。

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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM