GO1.18簡單實現泛型LinkedHashMap

簡單實現

// ListMap.go
package main

import "container/list"

// _listMapKV : 內部list.Element的Value
type _listMapKV[K string | int | uint, V any] struct {
	k K
	v V
}

// ListMap : LinkedHaspMap
type ListMap[K string | int | uint, V any] struct {
	List *list.List
	Map  map[K]*list.Element
}

// Init : 初始化,也可以用來清空
func (t *ListMap[K, V]) Init() *ListMap[K, V] {
	t.List = new(list.List)
	t.List.Init()
	t.Map = make(map[K]*list.Element)
	return t
}

// ListMapNew : 在堆中創建ListMap
func ListMapNew[K string | int, V any]() *ListMap[K, V] {
	tmp := new(ListMap[K, V])
	return tmp.Init()
}

// Put : 插入kv
func (t *ListMap[K, V]) Put(k K, v V) {
	val, ok := t.Map[k]
	s := _listMapKV[K, V]{}
	s.k = k
	s.v = v
	if !ok {
		e := t.List.PushBack(&s)
		t.Map[k] = e
	} else {
		val.Value = &s
	}
}

// Get : 按k獲得v
func (t *ListMap[K, V]) Get(k K) (v V, b bool) {
	val, ok := t.Map[k]
	b = ok
	if ok {
		v = val.Value.(*_listMapKV[K, V]).v
	}
	return
}

// Rm : 按k移除kv
func (t *ListMap[K, V]) Rm(k K) {
	val, b := t.Map[k]
	if b {
		delete(t.Map, k)
		t.List.Remove(val)
	}
}

// Each 按插入順序循環全部kv
func (t *ListMap[K, V]) Each(f func(k K, v V)) {
	e := t.List.Front()
	for e != nil {
		s := e.Value.(*_listMapKV[K, V])
		f(s.k, s.v)
		e = e.Next()
	}
}

使用

//main.go
package main

import "fmt"

func main() {
	lm := ListMapNew[string, *string]()
	k := "a"
	v := "aaa"
	lm.Put(k, &v)
	vv, _ := lm.Get(k)
	fmt.Println("get : ", vv, " -> ", *vv)
	lm.Rm(k)
	vv, ok := lm.Get(k)
	fmt.Println("rm and get : ", vv, " ok: ", ok)
	lm2 := ListMapNew[string, string]()
	lm2.Put(k, v)
	lm2.Each(func(k string, v string) {
		fmt.Println("each : ", k, " : ", v)
	})
	lm2.Init()
	vv2, ok := lm2.Get(k)
	fmt.Println("rm and get2 : ", len(vv2), " k: ", ok)
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章