Scala - 从元组到地图

时间:2012-10-21 19:59:04

标签: scala map

我希望如果我发布已解决的问题并要求更漂亮的解决方案,这样我就可以看到它是如何正确完成的

我想要一个用ProcessID映射的所有进程名称的列表。像"notepad.exe" -> 4242之类的东西 Ofc可以有多个实例,所以它应该是"notepad.exe" -> List(4242,7171)

我有一个给我一个元组的方法

private def extractProcess(s: String): (String, Int) = {
    val process = s.split(" ").filterNot(str => str == "")
    (process(0), process(1).toInt)
}

输出为("Notepad.exe",4242)

processList包含来自windows tasklist的原始字符串,看起来像这样

svchost.exe                   4464 Services                   0        47.656 K

现在我想创建一个包含所有进程的地图,我已经像这样做了

val process: Map[String, List[Int]] = Map()
    processList.drop(5).map(s => {
      val element = extractProcess(s)
      if (process contains element._1) {
        val p = process get element._1
        process(element._1) = p.get ::: List(element._2)
      } else {
        process(element._1) = List(element._2)
      }
    })

我对前5个元素进行了调整,因为它们不需要

现在输出看起来像这样

...
(tasklist.exe,List(5036))
(NLClientApp.exe,List(2812))
(wininit.exe,List(444))
(SearchFilterHost.exe,List(5476))
(svchost.exe,List(656, 732, 928, 964, 992, 1036, 1140, 1360, 2168, 4464, 4764, 5048))
...

这就是我想要做的。 是否有更好的方法来创建地图?

我总是认为比功能更有必要,很难想到不同。

2 个答案:

答案 0 :(得分:5)

可以这样简化:

processList.drop(5).map(extractProcess).groupBy(_._1).mapValues(_.map(_._2))

答案 1 :(得分:2)

processList.drop(5).map(extractProcess).groupBy(_._1).mapValues(_.map(_._2))