How to use priority queues in Scala?

后端 未结 2 1738
温柔的废话
温柔的废话 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))
    

提交回复
热议问题