まず、複合キーの私の定義-2つ以上の値を組み合わせてキーを作成します。データベースの複合キーと混同しないでください。
私の目標は、pow(x、y)の計算値をハッシュテーブルに保存することです(xとyは整数です)。これは私がキーを作成する方法についてのアイデアが必要なところです。そのため、xとyを指定して、ハッシュテーブルでそれを検索し、pow(x、y)を見つけることができます。
例えば。 pow(2、3)=> {key(2,3):8}関数/ key(2,3)を取得する方法は、私が理解したいものです。
一般に、ハッシュテーブルのキーとして使用しながら、複数の値の組み合わせであるキーを処理するための最良の方法は何ですか。
ありがとう
最も簡単で最も柔軟な方法は、struct
をキーのタイプとして使用することです。これには、キーの一部にしたいすべてのデータが含まれるため、次のようにします。
type Key struct {
X, Y int
}
そして、それだけです。それを使う:
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}])
出力( Go Playground で試してください):
2^2 = 4
2^3 = 8
仕様:マップタイプ: 比較演算子==
および!=
が完全に定義されているキー、および上記のKey
構造体タイプをキーとして使用できますこれを満たします。
仕様:比較演算子: すべてのフィールドが比較可能な場合、構造体の値は比較可能です。 2つの構造体の値は、対応する非 空白 フィールドが等しい場合に等しくなります。
重要なことの1つ:ポインターを比較するとメモリアドレスのみが比較され、ポイントされた値は比較されないため、キータイプとしてポインターを使用しないでください(例:*Key
)。
また、キータイプとして arrays ( slices ではない)を使用することもできますが、配列は構造体ほど柔軟ではありません。詳細については、こちらをご覧ください。 Goに配列がある理由
これは、配列の場合のようになります。
type Key [2]int
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}])
出力は同じです。 Go Playground で試してください。
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])
}
それが役に立てば幸い