Go 可排序的map


前言

众所周知,go map是无序的,每次遍历map得到的顺序是不一样的。如果非要实现有序,则只能先获取所有的key,再排序,然后遍历key,通过key获取value。

今天把上述操作封装了一下,写了一个可排序map。

接口

// 创建一个SortMap
func New[T comparable](data map[T]any) *SortMap[T]

// 排序。asc=true表示对key按升序排序,asc=false表示对key按降序排序
func (s *SortMap[T]) Sort(asc bool)

// 添加一个元素
func (s *SortMap[T]) Add(k T, v any)

// 添加一个map
func (s *SortMap[T]) AddMap(data map[T]any)

// 删除一个元素
func (s *SortMap[T]) Delete(k T)

// 获取一个元素
func (s *SortMap[T]) Get(k T)

// 获取所有key
func (s *SortMap[T]) Keys() []T

// 获取所有value
func (s *SortMap[T]) Values() []any

// 获取元素个数
func (s *SortMap[T]) Count() int

// 对每个元素处理
func (s *SortMap[T]) Each(f func(k T, v any) any)

// 过滤符合条件的元素
func (s *SortMap[T]) Filter(f func(T, any) bool)

// 删除符合条件的元素
func (s *SortMap[T]) Skip(f func(T, any) bool)

// 复制
func (s *SortMap[T]) Copy() *SortMap[T]

// 转换成普通map
func (s *SortMap[T]) ToMap() map[T]any

示例

package main

import (
	sortmap "sort_map"
)

func main() {
	sortMap := sortmap.New[string](nil) // {}
	sortMap.Add("a", "a")               // {"a":"a"}
	sortMap.AddMap(map[string]any{
		"b": "b",
		"c": "c",
	}) // {"a":"a","b":"b":,"c":"c"}
	sortMap.Delete("b")        // {"a":"a","c":"c"}
	_ = sortMap.Get("c")       // c
	sortMap.Delete("c")        // {"a":"a"}
	keys := sortMap.Keys()     // ["a"]
	values := sortMap.Values() // ["a"]
	sortMap.Add("e", "e")      // {"a":"a", "e":"e"}
	sortMap.Add("f", "f")      // {"a":"a", "e":"e", "f":"f"}
	sortMap.Each(func(k string, v any) any {
		if k == "a" {
			return "aa"
		}

		return v
	}) // {"a":"aa", "e":"e", "f":"f"}
	sortMap.Filter(func(s string, a any) bool {
		return s == "a"
	}) // {"a":"aa"}
	keys = sortMap.Keys()     // ["a"]
	values = sortMap.Values() // ["aa"]

	sortMap.Add("g", "g") // {"a":"aa", "g":"g"}
	sortMap.Skip(func(s string, a any) bool {
		return s == "a"
	}) // {"g":"g"}

	keys = sortMap.Keys()     // ["g"]
	values = sortMap.Values() // ["g"]
}

参考

[1]https://github.com/ZBIGBEAR/sort_map


文章作者: Alex
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex !
  目录