web-dev-qa-db-ja.com

golangでハッシュマップの複合キーを作成する方法

まず、複合キーの私の定義-2つ以上の値を組み合わせてキーを作成します。データベースの複合キーと混同しないでください。

私の目標は、pow(x、y)の計算値をハッシュテーブルに保存することです(xとyは整数です)。これは私がキーを作成する方法についてのアイデアが必要なところです。そのため、xとyを指定して、ハッシュテーブルでそれを検索し、pow(x、y)を見つけることができます。

例えば。 pow(2、3)=> {key(2,3):8}関数/ key(2,3)を取得する方法は、私が理解したいものです。

一般に、ハッシュテーブルのキーとして使用しながら、複数の値の組み合わせであるキーを処理するための最良の方法は何ですか。

ありがとう

7
Gaurav Sinha

最も簡単で最も柔軟な方法は、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)。

また、キータイプとして arraysslices ではない)を使用することもできますが、配列は構造体ほど柔軟ではありません。詳細については、こちらをご覧ください。 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 で試してください。

12
icza

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])
}

それが役に立てば幸い

4
Dean coakley