如何在Golang中为哈希图制作复合键

时间:2018-09-15 20:18:08

标签: dictionary go hashmap

首先,我对组合键的定义-两个或更多的值组合在一起构成键。不要与数据库中的组合键混淆。

我的目标是将pow(x,y)的计算值保存在哈希表中(x和y是整数)。在这里,我需要有关如何制作键的想法,以便在给定x和y的情况下,可以在哈希表中查找它,以找到pow(x,y)。

例如。 pow(2,3)=> {key(2,3):8} 我想弄清楚获取key(2,3)的功能/方式。

通常,当在哈希表中用作键时,处理键的最佳方法是多个值的组合。

谢谢

2 个答案:

答案 0 :(得分:9)

最简单,最灵活的方法是使用// optimize-inline作为密钥类型,包括您想成为密钥一部分的所有数据,因此在您的情况下:

struct

仅此而已。使用它:

type Key struct {
    X, Y int
}

输出(在Go Playground上尝试):

m := map[Key]int{}
m[Key{2, 2}] = 4
m[Key{2, 3}] = 8

fmt.Println("2^2 = ", m[Key{2, 2}])
fmt.Println("2^3 = ", m[Key{2, 3}])

Spec: Map types:您可以使用任何类型作为键,以完全定义比较运算符2^2 = 4 2^3 = 8 ==,并且上述!=结构类型可以满足要求。

Spec: Comparison operators:如果所有字段的值都是可比较的,则结构值是可比较的。如果两个结构值对应的非blank字段相等,则它们相等。

重要的一点:您不应该将指针用作键类型(例如Key),因为比较指针仅比较内存地址,而不是指针值。

还请注意,您还可以使用arrays(而不是slices)作为键类型,但是数组不如结构灵活。您可以在此处了解更多信息:Why have arrays in Go?

这是数组的样子:

*Key

输出是相同的。在Go Playground上尝试一下。

答案 1 :(得分:4)

Go不能对一片int进行哈希处理。

因此,我要解决的方法是将结构映射到数字。

以下是该操作的示例:

package main

import (
    "fmt"
)

type Nums struct {
    num1 int
    num2 int
}

func main() {
    powers := make(map[Nums]int)
    numbers := Nums{num1: 2, num2: 4}

    powers[numbers] = 6

    fmt.Printf("%v", powers[input])
}

我希望对您有帮助