26 votes

Comment créer une clé composite pour une carte de hachage en golang ?

Tout d'abord, ma définition de la clé composite : deux valeurs ou plus se combinent pour former la clé. À ne pas confondre avec les clés composites des bases de données.

Mon objectif est de sauvegarder les valeurs calculées de pow(x, y) dans une table de hachage (x et y sont des entiers). C'est là que j'ai besoin d'idées sur la façon de créer une clé, de sorte que, étant donné x et y, je puisse la rechercher dans la table de hachage, pour trouver pow(x,y).

Ex. pow(2, 3) => {key(2,3):8} La fonction / le moyen d'obtenir la clé (2,3) est ce que je veux comprendre.

En général, quelle est la meilleure façon de traiter une clé qui est une combinaison de plusieurs valeurs, en l'utilisant comme clé dans une table de hachage ?

Gracias

44voto

icza Points 3857

Le moyen le plus simple et le plus souple est d'utiliser un fichier struct comme type de clé, en incluant toutes les données que vous souhaitez voir faire partie de la clé, donc dans votre cas :

type Key struct {
    X, Y int
}

Et c'est tout. Je l'utilise :

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

Sortie (essayez-la sur le Go Playground ) :

2^2 =  4
2^3 =  8

Spec : Types de cartes : Vous pouvez utiliser n'importe quel type comme clé où les opérateurs de comparaison == y != sont entièrement définies, et les formules ci-dessus Key Le type struct remplit cette fonction.

Spec : Opérateurs de comparaison : Les valeurs des structures sont comparables si tous leurs champs sont comparables. Deux valeurs de structure sont égales si leurs champs non vierge sont égaux.

Une chose importante : vous ne devez pas utiliser un pointeur comme type de clé (ex. *Key ), car la comparaison des pointeurs ne compare que l'adresse mémoire, et non les valeurs pointées.

Notez également que vous pouvez aussi utiliser tableaux (pas tranches ) comme type de clé, mais les tableaux ne sont pas aussi flexibles que les structs. Vous pouvez en savoir plus à ce sujet ici : Pourquoi avoir des tableaux en Go ?

Voici à quoi cela ressemblerait avec des tableaux :

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

La sortie est la même. Essayez-le sur le Go Playground .

8voto

Dean coakley Points 738

Go ne peut pas faire un hash d'une tranche d'ints.

Par conséquent, la façon dont j'aborderais cette question serait de faire correspondre une structure à un nombre.

Voici un exemple de la façon dont cela pourrait être fait :

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

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X