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

wnavrhmk  于 2022-12-27  发布在  Kotlin
关注(0)|答案(2)|浏览(226)

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

data class Tuple(val column: Column, var count: Int)

其中Column

data class Column(val name: String, val dataType: String)

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

val compareByCount: Comparator<Tuple> = compareByDescending { it.count }
val pq = PriorityQueue<Tuple>(compareByCount)

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

rkue9o1l

rkue9o1l1#

根据我的理解,compareByDescending应该对count最大的元素和堆的开头进行排序。
但是,由于这不是给你预期的结果,也许你可以试试这个:

val compareByCount = Comparator<Tuple> {t1, t2 -> t1.count - t2.count}

或者更简单,无需自定义比较器:

val pq = PriorityQueue {t1: Tuple, t2 : Tuple -> t1.count - t2.count}

这将以相反的顺序将元素添加到堆中,即compareByDescending

pgvzfuti

pgvzfuti2#

对于最大堆使用compareBy对于最小堆使用compareByDescending
最小优先级队列示例:

val queue = PriorityQueue<Int>(compareByDescending({it}))

最大优先级队列示例:

val queue = PriorityQueue<Int>(compareBy({it}))

相关问题