簡體   English   中英

我如何在 scala 中包含可變的 HashMap 值

[英]how I can contain mutable HashMap value in scala

我有一個關於如何在 Scala 中使用 hash 地圖的問題。

我的問題是如何將多個值與同一個鍵組合起來。

這是數據。

val mm = new HashMap[String, Set[String]] with MultiMap[String, String]

mm.addBinding("1","D1")
mm.addBinding("1","D2")
mm.addBinding("1","D7")
mm.addBinding("2","D2")
mm.addBinding("2","D3")
mm.addBinding("2","D4")
mm.addBinding("3","D4")
mm.addBinding("4","D5")
mm.addBinding("5","D6")

結果:

key: 2, value: Set(D2, D3, D4)
key: 5, value: Set(D6)
key: 1, value: Set(D1, D2, D7)
key: 4, value: Set(D5)
key: 3, value: Set(D4)

我想得到這樣的結果。

key: 2, value: Set(D2, D3, D4, D1, D7)
key: 5, value: Set(D6)
key: 4, value: Set(D5)

因為 Key 2, Key 1, K 3 有相同的值 (= D2) (= D4) 如果你有相同的值,你想組合。

KEY 值無關緊要。 如果甚至一個值重疊,我想制作一組。

所以。 這也可以

key: 1, value: Set(D2, D3, D4, D1, D7)
key: 5, value: Set(D6)
key: 4, value: Set(D5)

或者

key: 3, value: Set(D2, D3, D4, D1, D7)
key: 5, value: Set(D6)
key: 4, value: Set(D5)

您需要使用mm map 執行一些額外的處理。 請參見下面的代碼:

import scala.collection.mutable._

val mm = new HashMap[String, Set[String]] with MultiMap[String, String]

mm.addBinding("1","D1")
mm.addBinding("1","D2")
mm.addBinding("1","D7")
mm.addBinding("2","D2")
mm.addBinding("2","D3")
mm.addBinding("2","D4")
mm.addBinding("3","D4")
mm.addBinding("4","D5")
mm.addBinding("5","D6")

var nn = new HashMap[Set[String], Set[String]]
mm.map { case (k, vs) =>
  nn.find(_._2.intersect(vs).nonEmpty).fold {
    // No overlap
    nn = nn.addOne(Set(k) -> vs)
  } { case (ks, vss) =>
    // Find overlap, merging the keys and values
    nn = nn.subtractOne(ks).addOne(ks.union(Set(k)) -> vs.union(vss))
  }
}
nn // HashMap(HashSet(4) -> HashSet(D5), HashSet(5) -> HashSet(D6), HashSet(1, 2, 3) -> HashSet(D4, D7, D1, D2, D3))

// If you want the key to be just one value
val ll = nn.map { case (ks, vs) =>
  ks.head -> vs
}
ll // HashMap(1 -> HashSet(D4, D7, D1, D2, D3), 4 -> HashSet(D5), 5 -> HashSet(D6))

游樂場示例: https://scastie.scala-lang.org/W8fx8uIbStyoxEveOi89GA

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM