You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hello-algo/codes/go/chapter_hashing/array_hash_map.go

97 lines
1.7 KiB

// File: array_hash_map.go
// Created Time: 2022-12-14
// Author: msk397 (machangxinq@gmail.com)
package chapter_hashing
import "fmt"
// 键值对 int->String
type Entry struct {
key int
val string
}
// 基于数组简易实现的哈希表
type ArrayHashMap struct {
bucket []Entry
}
func newArrayHashMap() *ArrayHashMap {
// 初始化一个长度为 100 的桶(数组)
bucket := make([]Entry, 100)
return &ArrayHashMap{bucket: bucket}
}
// 哈希函数
func (a *ArrayHashMap) hashFunc(key int) int {
index := key % 100
return index
}
// 查询操作
func (a *ArrayHashMap) get(key int) string {
index := a.hashFunc(key)
pair := a.bucket[index]
if pair.key == 0 {
return ""
}
return pair.val
}
// 添加操作
func (a *ArrayHashMap) put(key int, val string) {
pair := Entry{key: key, val: val}
index := a.hashFunc(key)
a.bucket[index] = pair
}
// 删除操作
func (a *ArrayHashMap) remove(key int) {
index := a.hashFunc(key)
// 置为空字符,代表删除
a.bucket[index] = Entry{}
}
// 获取所有键对
func (a *ArrayHashMap) entrySet() []Entry {
var pairs []Entry
for _, pair := range a.bucket {
if pair.key != 0 {
pairs = append(pairs, pair)
}
}
return pairs
}
// 获取所有键
func (a *ArrayHashMap) keySet() []int {
var keys []int
for _, pair := range a.bucket {
if pair.key != 0 {
keys = append(keys, pair.key)
}
}
return keys
}
// 获取所有值
func (a *ArrayHashMap) valueSet() []string {
var values []string
for _, pair := range a.bucket {
if pair.key != 0 {
values = append(values, pair.val)
}
}
return values
}
// 打印哈希表
func (a *ArrayHashMap) print() {
for _, pair := range a.bucket {
if pair.key != 0 {
fmt.Println(pair.key, "->", pair.val)
}
}
}