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 に答える