首页 > 解决方案 > 科特林 | 具有自定义比较器的最大堆类型的优先级队列

问题描述

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

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计数最少的对象。为什么会这样?即使我提供了一个按降序检查的比较器。

标签: kotlin

解决方案


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

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

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

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

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

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


推荐阅读