Scala 中 HashMap 的优先级队列
Priority Queue of HashMaps in Scala
我正在尝试更新我的 HashMap 优先级队列中一个元素的值,但没有成功。这是我的做法:
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")
}
}
不幸的是,我总是收到 "Not found" 消息。关于我做错了什么或如何更新哈希值的任何想法?
显然您的类型不匹配。如果您查看 get
函数的定义,您将看到以下内容 (http://www.scala-lang.org/api/2.11.6/index.html#scala.collection.mutable.HashMap):
def get(key: A): Option[B]
这意味着,它 returns 的值在您的案例中键入为 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
函数而不是使用 remove
和 put
:hashMap.update(77, 32)
我正在尝试更新我的 HashMap 优先级队列中一个元素的值,但没有成功。这是我的做法:
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")
}
}
不幸的是,我总是收到 "Not found" 消息。关于我做错了什么或如何更新哈希值的任何想法?
显然您的类型不匹配。如果您查看 get
函数的定义,您将看到以下内容 (http://www.scala-lang.org/api/2.11.6/index.html#scala.collection.mutable.HashMap):
def get(key: A): Option[B]
这意味着,它 returns 的值在您的案例中键入为 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
函数而不是使用 remove
和 put
:hashMap.update(77, 32)