前言
众所周知,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"]
}