如何在 Scala 中组合 fastutil 映射?
How do I combine fastutil maps in scala?
在 scala 中组合两个 Object2IntOpenHashMap[String] 的最快方法是什么?希望合并这两张地图:
val foo = new Object2IntOpenHashMap[String]
foo.put("foo", 1)
val bar = new Object2IntOpenHashMap[String]
bar.put("foo", 1)
bar.put("bar", 1)
并产生 {"foo" : 2, "bar" : 1} 的输出。
下面是组合 2 个 Object2IntOpenHashMap 值的命令式方法。
val foo = new Object2IntOpenHashMap[String]
foo.put("foo", 1)
val bar = new Object2IntOpenHashMap[String]
bar.put("foo", 1)
bar.put("bar", 1)
bar.keySet().forEach(x => {
val barValue = bar.getInt(x)
foo.computeInt(x , (_, v) => if(v == null) barValue else barValue + v)
})
println(foo)
上面的println(foo)
会打印{bar=>1, foo=>2}
.
但是如果你想要更实用的方式,你应该使用更实用的库,比如 cats 或 scalaz。我用猫做了这个 -
import cats.Semigroup
import cats.implicits._
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap
implicit val Object2IntOpenHashMapSemiGroup = new Semigroup[Object2IntOpenHashMap[String]] {
override def combine(x: Object2IntOpenHashMap[String], y: Object2IntOpenHashMap[String]): Object2IntOpenHashMap[String] = {
val result: Object2IntOpenHashMap[String] = y.clone()
x.keySet().forEach(x => {
val barValue = y.getInt(x)
result.computeInt(x , (_, v) => if(v == null) barValue else barValue +v)
})
result
}
}
println(foo combine bar)
println(Object2IntOpenHashMapSemiGroup.combine(foo, bar))
你会得到和以前一样的结果。您可以在此处查看半群 here.
的文档
找到使用快速入门集的替代方法:
val foo = new Object2IntOpenHashMap[String]
foo.put("foo", 1)
val bar = new Object2IntOpenHashMap[String]
bar.put("foo", 1)
bar.put("bar", 1)
val mapIter = bar.object2IntEntrySet().fastIterator()
while(mapIter.hasNext()) {
val x = mapIter.next()
foo.put(x.getKey(), x.getIntValue() + foo.getOrDefault(x.getKey(), 0))
}
println(foo)
在 scala 中组合两个 Object2IntOpenHashMap[String] 的最快方法是什么?希望合并这两张地图:
val foo = new Object2IntOpenHashMap[String]
foo.put("foo", 1)
val bar = new Object2IntOpenHashMap[String]
bar.put("foo", 1)
bar.put("bar", 1)
并产生 {"foo" : 2, "bar" : 1} 的输出。
下面是组合 2 个 Object2IntOpenHashMap 值的命令式方法。
val foo = new Object2IntOpenHashMap[String]
foo.put("foo", 1)
val bar = new Object2IntOpenHashMap[String]
bar.put("foo", 1)
bar.put("bar", 1)
bar.keySet().forEach(x => {
val barValue = bar.getInt(x)
foo.computeInt(x , (_, v) => if(v == null) barValue else barValue + v)
})
println(foo)
上面的println(foo)
会打印{bar=>1, foo=>2}
.
但是如果你想要更实用的方式,你应该使用更实用的库,比如 cats 或 scalaz。我用猫做了这个 -
import cats.Semigroup
import cats.implicits._
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap
implicit val Object2IntOpenHashMapSemiGroup = new Semigroup[Object2IntOpenHashMap[String]] {
override def combine(x: Object2IntOpenHashMap[String], y: Object2IntOpenHashMap[String]): Object2IntOpenHashMap[String] = {
val result: Object2IntOpenHashMap[String] = y.clone()
x.keySet().forEach(x => {
val barValue = y.getInt(x)
result.computeInt(x , (_, v) => if(v == null) barValue else barValue +v)
})
result
}
}
println(foo combine bar)
println(Object2IntOpenHashMapSemiGroup.combine(foo, bar))
你会得到和以前一样的结果。您可以在此处查看半群 here.
的文档找到使用快速入门集的替代方法:
val foo = new Object2IntOpenHashMap[String]
foo.put("foo", 1)
val bar = new Object2IntOpenHashMap[String]
bar.put("foo", 1)
bar.put("bar", 1)
val mapIter = bar.object2IntEntrySet().fastIterator()
while(mapIter.hasNext()) {
val x = mapIter.next()
foo.put(x.getKey(), x.getIntValue() + foo.getOrDefault(x.getKey(), 0))
}
println(foo)