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  }