Scala中HashMaps的优先级队列

时间:2015-03-25 17:20:06

标签: scala hashmap priority-queue

我正在尝试更新我的HashMaps优先级队列元素的值,但没有成功。这是我正在做的事情:

def HashMapOrdering = new Ordering[HashMap[Int,Int]] {

  def compare(a : HashMap[Int,Int], b : HashMap[Int,Int]) = b.valuesIterator.next().compare(a.valuesIterator.next())

}

def main(args: Array[String]) {

  var seeds = PriorityQueue[HashMap[Int, Int]]()(HashMapOrdering)
  seeds.enqueue(HashMap(4 -> 4), HashMap(234 -> 5), HashMap(78 -> 6), HashMap(89 -> 1))

  seeds.find(x => x.get(89) == 1) match {

    case Some(hashMap: HashMap[Int, Int]) => hashMap.remove(77); hashMap.put(77,32)
    case None => println("Not found")

  }

}

不幸的是,我总是收到“未找到”的消息。关于我做错了什么或如何更新哈希值的任何想法?

1 个答案:

答案 0 :(得分:1)

显然你的类型不匹配。如果您查看get函数的定义,您会看到以下内容(http://www.scala-lang.org/api/2.11.6/index.html#scala.collection.mutable.HashMap):

def get(key: A): Option[B]

这意味着,它会返回您的案例中的值Option[Int]。因此,将您的正确条件参数包装在Option monad中:

seeds.find(x => x.get(89) == Some(1)) match {
    case Some(hashMap: HashMap[Int, Int]) => {
        hashMap.remove(77)
        hashMap.put(77,32)
    }
    case None => println("Not found")
}

按预期工作。

P.S。忘记了有关更新的问题:您可以使用update功能,而不是使用removeputhashMap.update(77, 32)