Как мне объединить карты fastutil в scala? - PullRequest
0 голосов
/ 05 февраля 2019

Какой самый быстрый способ объединить два 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 ]

0 голосов
/ 06 февраля 2019

Найден альтернативный вариант с использованием быстрого набора:

  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)
0 голосов
/ 05 февраля 2019

Ниже приведен обязательный способ объединить 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}.

Но если вы хотите более функциональный способ, вам следуетиспользуйте более функциональные ибриры, такие как кошки или скалаз.Я сделал это, используя кошек -

            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))

Вы получите тот же результат, что и раньше.Вы можете увидеть документацию здесь для полугруппы здесь .

...