我希望如果我发布已解决的问题并要求更漂亮的解决方案,这样我就可以看到它是如何正确完成的
我想要一个用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))
...
这就是我想要做的。 是否有更好的方法来创建地图?
我总是认为比功能更有必要,很难想到不同。
答案 0 :(得分:5)
可以这样简化:
processList.drop(5).map(extractProcess).groupBy(_._1).mapValues(_.map(_._2))
答案 1 :(得分:2)
processList.drop(5).map(extractProcess).groupBy(_._1).mapValues(_.map(_._2))