Как мне объединить карты fastutil в scala?
Какой самый быстрый способ объединить два Object2IntOpenHashMap[String] в Scala? Нужно объединить эти две карты:
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}
,
Но если вы хотите более функциональный способ, вы должны использовать более функциональные ibrary, такие как кошки или скалязы. Я сделал это с помощью кошек -
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))
Вы получите тот же результат, что и раньше. Вы можете увидеть документацию здесь для полугруппы здесь.
Нашел альтернативу, используя быстрый набор записей:
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)