1

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

我想要一个使用 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 任务列表的原始字符串,看起来像这样

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

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

我总是认为比功能更重要,很难有不同的想法。

4

2 回答 2

5

可以像这样更简单:

processList.drop(5).map(extractProcess).groupBy(_._1).mapValues(_.map(_._2))
于 2012-10-21T20:09:45.217 回答
2
processList.drop(5).map(extractProcess).groupBy(_._1).mapValues(_.map(_._2))
于 2012-10-21T20:15:20.567 回答