科特林 | 具有自定义比较器的最大堆类型的优先级队列

Abh*_*pta 6 kotlin

我想为以下类的对象创建一个优先级队列(最大堆)

data class Tuple(val column: Column, var count: Int)
Run Code Online (Sandbox Code Playgroud)

哪里Column

data class Column(val name: String, val dataType: String)
Run Code Online (Sandbox Code Playgroud)

我编写了以下代码来使用自定义比较器实例化上述类对象的优先级队列,如下所示:

val compareByCount: Comparator<Tuple> = compareByDescending { it.count }
val pq = PriorityQueue<Tuple>(compareByCount) 
Run Code Online (Sandbox Code Playgroud)

当我填充PriorityQueue并执行时pq.peek(),它返回Tuple计数最低的对象。为什么会这样呢?尽管我提供了一个按降序检查的比较器。

say*_*rre 7

根据我的理解,compareByDescending应该对最大的元素count和堆的开头进行排序。

但由于这没有给你预期的结果,也许你可以尝试一下:

val compareByCount = Comparator<Tuple> {t1, t2 -> t1.count - t2.count}
Run Code Online (Sandbox Code Playgroud)

或者更简单,没有自定义比较器:

val pq = PriorityQueue {t1: Tuple, t2 : Tuple -> t1.count - t2.count}
Run Code Online (Sandbox Code Playgroud)

这将以相反的顺序将元素添加到堆中,如下所示compareByDescending