go - 如何在自定义类型上构建堆
问题描述
我有一个 KeyValue 类型,如下所示:
type KeyValue struct {
Key string
Value string
}
由于我想在它上面构建一个堆,所以我定义了一个 ByKey 类型并实现了heap.Interface
接口
type ByKey []KeyValue
func (a ByKey) Len() int { return len(a) }
func (a ByKey) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a ByKey) Less(i, j int) bool { return a[i].Key < a[j].Key }
func (a *ByKey) Push(x interface{}) {
*a = append(*a, x.(KeyValue))
}
func (a *ByKey) Pop() interface{} {
old := *a
n := len(old)
x := old[n-1]
*a = old[0 : n-1]
return x
}
但是当我运行测试时,容器/堆不起作用。我的测试代码在这里:
dic := []string{"1", "2", "3", "4", "5", "6", "7", "8", "9"}
generate := func(min, max int) *ByKey {
n := rand.Intn(max - min) + min
kvs := make(ByKey, 0)
for i := 0; i < n; i++ {
idx := rand.Intn(len(dic))
kvs = append(kvs, KeyValue{
Key: dic[idx],
Value: "1",
})
}
return &kvs
}
kv1 := generate(10, 15)
fmt.Printf("before heapify kv1: %v\n", *kv1)
heap.Init(kv1)
fmt.Printf("after heapify kv1: %v\n", *kv1)
输出是:
before heapify kv1: [{7 1} {3 1} {3 1} {5 1} {7 1} {8 1} {9 1} {5 1} {7 1} {6 1} {8 1}]
after heapify kv1: [{3 1} {5 1} {3 1} {5 1} {6 1} {8 1} {9 1} {7 1} {7 1} {7 1} {8 1}]
不幸的kv1
是,它不是按键排序的。Swap()
我认为,Push()
或等函数应该有问题Pop()
。任何帮助表示赞赏。
解决方案
推荐阅读
- r - 当我在 R 中绘制两个“y”轴时,是否有一个 ggplot2 表格可以“反转”一个轴(geom_bar())
- shell - 将序列号作为序列添加到 UNIX 中特定位置的文件中的每一行
- xcode - 在工作区中的多个项目之间共享 xcconfig 文件
- powershell - PowerShell 立即关闭
- google-cloud-platform - 如何使用资源管理器 API 在无组织下列出我的 GCP 项目?
- sql - 使用@Query时如何修复Spring框架中的UnsatisfiedDependencyException
- django - 如何使用 Django Rest Framework 支持可选或空 FileField?
- apache-kafka-streams - 有没有办法将数据发送到主题的特定分区
- apache-spark - 在将数据加载到配置单元时在字段中添加周围的引号
- python - 如何在多个子目录中找到具有相同扩展名的所有文件并使用 python 将它们移动到单独的文件夹中?