How to use priority queues in Scala?

后端 未结 2 1743
温柔的废话
温柔的废话 2021-02-07 07:53

I am trying to implement A* search in Scala (version 2.10), but I\'ve ran into a brick wall - I can\'t figure out how to use Scala\'s Priority Queue. It seems like a simple task

相关标签:
2条回答
  • 2021-02-07 08:43

    There is actually pre-defined lexicographical order for tuples -- but you need to import it:

    import scala.math.Ordering.Implicits._
    

    Moreover, you can define your own ordering. Suppose I want to arrange tuples, based on the difference between first and second members of the tuple:

    scala> import scala.collection.mutable.PriorityQueue
    //  import scala.collection.mutable.PriorityQueue
    
    scala> def diff(t2: (Int,Int)) = math.abs(t2._1 - t2._2)
    // diff: (t2: (Int, Int))Int
    
    scala> val x = new PriorityQueue[(Int, Int)]()(Ordering.by(diff))
    // x: scala.collection.mutable.PriorityQueue[(Int, Int)] = PriorityQueue()
    
    scala> x.enqueue(1 -> 1)
    
    scala> x.enqueue(1 -> 2)
    
    scala> x.enqueue(1 -> 3)
    
    scala> x.enqueue(1 -> 4)
    
    scala> x.enqueue(1 -> 0)
    
    scala> x
    // res5: scala.collection.mutable.PriorityQueue[(Int, Int)] = PriorityQueue((1,4), (1,3), (1,2), (1,1), (1,0))
    
    0 讨论(0)
  • 2021-02-07 08:47

    Indeed, there is no implicit ordering on pairs of integers (a, b). What would it be? Perhaps they are both positive and you can use (a - 1.0/b)? Or they are not, and you can use, what, (a + atan(b/pi))? If you have an ordering in mind, you can consider wrapping your pairs in a type that has your ordering.

    0 讨论(0)
提交回复
热议问题