go二维map_Go 语言Map(集合)

基于 go 实现简单 HashMap,暂未做 key 值的校验。

package main

import (

"fmt"

)

type HashMap struct {

key string

value string

hashCode int

next *HashMap

}

var table [16](*HashMap)

func initTable() {

for i := range table{

table[i] = &HashMap{"","",i,nil}

}

}

func getInstance() [16](*HashMap){

if(table[0] == nil){

initTable()

}

return table

}

func genHashCode(k string) int{

if len(k) == 0{

return 0

}

var hashCode int = 0

var lastIndex int = len(k) - 1

for i := range k {

if i == lastIndex {

hashCode += int(k[i])

break

}

hashCode += (hashCode + int(k[i]))*31

}

return hashCode

}

func indexTable(hashCode int) int{

return hashCode%16

}

func indexNode(hashCode int) int {

return hashCode>>4

}

func put(k string, v string) string {

var hashCode = genHashCode(k)

var thisNode = HashMap{k,v,hashCode,nil}

var tableIndex = indexTable(hashCode)

var nodeIndex = indexNode(hashCode)

var headPtr [16](*HashMap) = getInstance()

var headNode = headPtr[tableIndex]

if (*headNode).key == "" {

*headNode = thisNode

return ""

}

var lastNode *HashMap = headNode

var nextNode *HashMap = (*headNode).next

for nextNode != nil && (indexNode((*nextNode).hashCode) < nodeIndex){

lastNode = nextNode

nextNode = (*nextNode).next

}

if (*lastNode).hashCode == thisNode.hashCode {

var oldValue string = lastNode.value

lastNode.value = thisNode.value

return oldValue

}

if lastNode.hashCode < thisNode.hashCode {

lastNode.next = &thisNode

}

if nextNode != nil {

thisNode.next = nextNode

}

return ""

}

func get(k string) string {

var hashCode = genHashCode(k)

var tableIndex = indexTable(hashCode)

var headPtr [16](*HashMap) = getInstance()

var node *HashMap = headPtr[tableIndex]

if (*node).key == k{

return (*node).value

}

for (*node).next != nil {

if k == (*node).key {

return (*node).value

}

node = (*node).next

}

return ""

}

//examples

func main() {

getInstance()

put("a","a_put")

put("b","b_put")

fmt.Println(get("a"))

fmt.Println(get("b"))

put("p","p_put")

fmt.Println(get("p"))

}

archer

archer

tag***en199@163.com2年前 (2019-05-18)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值