github.com/chenjiandongx/go-queue@v0.0.0-20191023082232-e2a36f382f84/ordered_map.go (about) 1 package collections 2 3 type linkedList struct { 4 next, prev *linkedList 5 key, value interface{} 6 } 7 8 type OrderedMap struct { 9 head, tail, current *linkedList 10 len int 11 items map[interface{}]*linkedList 12 } 13 14 func NewOrderedMap() *OrderedMap { 15 headNode := &linkedList{} 16 tailNode := &linkedList{} 17 headNode.next, tailNode.prev = tailNode, headNode 18 return &OrderedMap{ 19 head: headNode, 20 tail: tailNode, 21 current: headNode, 22 len: 0, 23 items: make(map[interface{}]*linkedList), 24 } 25 } 26 27 func (om *OrderedMap) Set(key, value interface{}) { 28 if _, ok := om.items[key]; ok { 29 om.items[key].value = value 30 return 31 } 32 newNode := &linkedList{prev: om.tail, next: nil, key: key, value: value} 33 om.items[key] = newNode 34 om.tail.next = newNode 35 om.tail = newNode 36 om.len++ 37 } 38 39 func (om *OrderedMap) Get(key interface{}) (interface{}, bool) { 40 if v, ok := om.items[key]; ok { 41 return v.value, ok 42 } 43 return nil, false 44 } 45 46 func (om *OrderedMap) Delete(key interface{}) bool { 47 item, ok := om.items[key] 48 if !ok { 49 return ok 50 } 51 if item.next == nil { 52 om.tail.prev, om.tail.next = om.tail, nil 53 } else { 54 item.prev.next, item.next.prev = item.next, item.prev 55 } 56 delete(om.items, key) 57 item = nil 58 om.len-- 59 return true 60 } 61 62 func (om *OrderedMap) Iter() (interface{}, interface{}, bool) { 63 c := om.current.next 64 if c.next != nil { 65 om.current = om.current.next 66 return c.next.key, c.next.value, true 67 } 68 return nil, nil, false 69 } 70 71 func (om *OrderedMap) BackToHead() { 72 om.current = om.head 73 } 74 75 func (om *OrderedMap) Len() int { 76 return om.len 77 }