Как сделать составной ключ для хэш-карты в Голанге - PullRequest
0 голосов
/ 15 сентября 2018

Во-первых, мое определение составного ключа - два или более значений объединяются в ключ. Не путать с составными ключами в базах данных.

Моя цель - сохранить вычисленные значения pow (x, y) в хеш-таблице (x и y - целые числа). Здесь мне нужны идеи о том, как сделать ключ, чтобы, учитывая x и y, я мог найти его в хеш-таблице, чтобы найти pow (x, y).

Например. pow (2, 3) => {key (2,3): 8} Функция / способ получить ключ (2,3) - это то, что я хочу выяснить.

В общем, каков наилучший способ обработки ключа, представляющего собой комбинацию нескольких значений, при использовании в качестве ключа в хэш-таблице.

Спасибо

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Самый простой и гибкий способ - использовать 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

Spec: Типы карт: Вы можете использовать любые типы в качестве ключа, когда операторы сравнения == и != полностью определены, и вышеприведенный Key тип структуры выполняет это.

Spec: Операторы сравнения: Значения структур сравнимы, если все их поля сравнимы. Два структурных значения равны, если их соответствующие не пустые поля равны.

Одна важная вещь: вы не должны использовать указатель в качестве типа ключа (например, *Key), потому что сравнение указателей сравнивает только адрес памяти, а не указанные значения.

Также обратите внимание, что вы также можете использовать массивы (не слайсы ) в качестве типа ключа, но массивы не так гибки, как структуры. Подробнее об этом можно прочитать здесь: Почему в 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 .

0 голосов
/ 15 сентября 2018

Go не может создать хеш из кусочка целых.

Поэтому, как я бы подошел, это сопоставить структуру с числом.

Вот пример того, как это можно сделать:

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

Надеюсь, это поможет

...