我有一個KeyValue類型,看起來像這里:type KeyValue struct { Key string Value string}由于我想在其上構建一個堆,因此我定義了一個ByKey類型并實現了該接口heap.Interfacetype ByKey []KeyValuefunc (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}]不幸的是,沒有按鍵排序。我認為像 、 或 這樣的函數中應該有問題。任何幫助是值得贊賞的。kv1Swap()Push()Pop()
1 回答

慕勒3428872
TA貢獻1848條經驗 獲得超6個贊
根據文檔:
堆是實現優先級隊列的常用方法。若要生成優先級隊列,請實現 Heap 接口,其中(負)優先級作為 Less 方法的順序,因此 Push 添加項目,而 Pop 從隊列中刪除優先級最高的項目。這些例子包括這樣的實現;文件example_pq_test.go具有完整的源代碼。
嘗試堆砌。彈出一個值:
for kv1.Len() > 0 {
fmt.Printf("%d ", heap.Pop(kv1))
}
{3 1}
{3 1}
{5 1}
{5 1}
{6 1}
{7 1}
{7 1}
{7 1}
{8 1}
{8 1}
{9 1}
- 1 回答
- 0 關注
- 77 瀏覽
添加回答
舉報
0/150
提交
取消