2015-03-25 4 views
0

Я пытаюсь обновить значение элемента моей очереди приоритетов HashMaps без успеха. Вот как я это делаю:Priority Queue of HashMaps в Scala

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

Очевидно, что у вас есть несоответствие типа. Если посмотреть определение из 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 монады:

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)