golang切片操作的各类辅助函数,包含,去重,删除,排序,倒序、随机、集合操作等

yudeguang · · 4849 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

写了个包([github.com/yudeguang/slice](http://github.com/yudeguang/slice "github.com/yudeguang/slice")),用于切片处理时经常会遇到的一些操作。如果发现里面有BUG,也欢迎大家下面留言。 slice包主要用于对于切片的各类操作,主要包括如下函数: - **Copy** 安全复制 - **Contains** 判断是否包含 - **InsertIgnore** 插入不重复元素 - **DeleteByElement** 根据元素删除(不会改变原有切片) - **DeleteByIndex** 根据下标范围删除,也可以只删除单个下标位置的元素(不会改变原有切片) - **Distinct** 去重复(元素个数较大时会自动切换为hash算法) - **InnerJoin** 内连接(元素个数较大时会自动切换为hash算法) - **Union** 合并去重(元素个数较大时会自动切换为hash算法) - **NotIn** 相减--返回mNotInN(元素个数较大时会自动切换为hash算法) - Left 返回左侧若干元素 - Right 返回右侧若干元素 - **Reverse** 倒序排列 - **Shuffling** 随机 - **Sort** 排序 由于go暂时不支持泛型,所以目前是针对每一种基础类型都分别编写了所对应的相关函数。以string类型为列: ```go package main import ( "fmt" "github.com/yudeguang/slice" "github.com/yudeguang/stringsx" "log" ) func main() { log.SetFlags(log.Lshortfile | log.Ltime) s1 := "abcdefabcdef3434" s2 := "bcdefgbcdefg02323" m := stringsx.SplitByLen(s1, 1) n := stringsx.SplitByLen(s2, 1) //先观察一下两个切片 log.Println("原始m,n分别如下:") log.Println("m为:") log.Println(m) log.Println("n为:") log.Println(n) //复制 fmt.Println("") log.Println("复制CopyString:") copyM := slice.CopyString(m) log.Println("copyM为:") log.Println(copyM) log.Println("m为:") log.Println(m) log.Printf("copyM的地址:%p", copyM) log.Printf(" m的地址:%p", m) /* 增删改查 增:实现了InsertIgnore 删:实现以下两种,根据元素值删除DeleteByElement,根据下标索引位置删除DeleteByIndex */ //插入不重复数据 fmt.Println("") log.Println("插入不重复数据InsertIgnoreString:") log.Println("m插入元素y后:") log.Println(slice.InsertIgnoreString(m, "y")) log.Println("m为:") log.Println(m) log.Println("m插入元素a后:") log.Println(slice.InsertIgnoreString(m, "a")) log.Println("m为:") log.Println(m) //删除某个元素 fmt.Println("") log.Println("删除元素DeleteByElementString:") log.Println("m删除元素a后的结果为:") log.Println(slice.DeleteByElementString(m, "a")) log.Println("m为:") log.Println(m) //删除第i个元素 fmt.Println("") log.Println("删除第i个元素DeleteByIndexString:") log.Println("m删除下标为3的元素后的结果为:") log.Println(slice.DeleteByIndexString(m, 3)) log.Println("m为:") log.Println(m) //删除一段元素 fmt.Println("") log.Println("删除一段元素DeleteByIndexString:") log.Println("m删除下标从3到5(不包含5)的元素后的结果为:") log.Println(slice.DeleteByIndexString(m, 3, 5)) log.Println("m为:") log.Println(m) //是否包含 fmt.Println("") log.Println("是否包含ContainsString:") log.Println("m是否包含元素a", slice.ContainsString(m, "a")) log.Println("m是否包含元素x", slice.ContainsString(m, "x")) log.Println("m为:") log.Println(m) //去重复 fmt.Println("") log.Println("去重复DistinctString:") log.Println("m去重复后的结果为:") log.Println(slice.DistinctString(m)) log.Println("m为:") log.Println(m) /* 集合操作,实现了: innerJoin union notin */ //内连接 fmt.Println("") log.Println("内连接innerJoinString:") log.Println("m与n内连接结果为:") log.Println(slice.InnerJoinString(m, n)) log.Println("m为:") log.Println(m) log.Println("n为:") log.Println(n) //合并去重 fmt.Println("") log.Println("合并去重UnionString:") log.Println("m与n合并去重结果为:") log.Println(slice.UnionString(m, n)) log.Println("m为:") log.Println(m) log.Println("n为:") log.Println(n) //集合m不在集合n中的元素即m-n 注意,不对m做去重操作 fmt.Println("") log.Println("相减NotInString:") log.Println("m-n结果为:") log.Println(slice.NotInString(m, n)) log.Println("m为:") log.Println(m) log.Println("n为:") log.Println(n) /* 以下操作会改变切片本身 Reverse sort Shuffling */ //倒序 fmt.Println("") log.Println("倒序ReverseString:") slice.ReverseString(m) log.Println("m为:") log.Println(m) //从小到大排序 fmt.Println("") log.Println("排序SortString:") slice.SortString(m) log.Println("m为:") log.Println(m) //随机打乱 fmt.Println("") log.Println("随机打乱ShufflingString:") slice.ShufflingString(m) log.Println("m为:") log.Println(m) slice.ShufflingString(m) log.Println("m为:") log.Println(m) } ``` 执行结果如下: ```go 22:32:41 main.go:17: 原始m,n分别如下: 22:32:41 main.go:18: m为: 22:32:41 main.go:19: [a b c d e f a b c d e f 3 4 3 4] 22:32:41 main.go:20: n为: 22:32:41 main.go:21: [b c d e f g b c d e f g 0 2 3 2 3] 22:32:41 main.go:25: 复制CopyString: 22:32:41 main.go:27: copyM为: 22:32:41 main.go:28: [a b c d e f a b c d e f 3 4 3 4] 22:32:41 main.go:29: m为: 22:32:41 main.go:30: [a b c d e f a b c d e f 3 4 3 4] 22:32:41 main.go:31: copyM的地址:0xc042086100 22:32:41 main.go:32: m的地址:0xc042086000 22:32:41 main.go:40: 插入不重复数据InsertIgnoreString: 22:32:41 main.go:41: m插入元素y后: 22:32:41 main.go:42: [a b c d e f a b c d e f 3 4 3 4 y] 22:32:41 main.go:43: m为: 22:32:41 main.go:44: [a b c d e f a b c d e f 3 4 3 4] 22:32:41 main.go:45: m插入元素a后: 22:32:41 main.go:46: [a b c d e f a b c d e f 3 4 3 4] 22:32:41 main.go:47: m为: 22:32:41 main.go:48: [a b c d e f a b c d e f 3 4 3 4] 22:32:41 main.go:52: 删除元素DeleteByElementString: 22:32:41 main.go:53: m删除元素a后的结果为: 22:32:41 main.go:54: [b c d e f b c d e f 3 4 3 4] 22:32:41 main.go:55: m为: 22:32:41 main.go:56: [a b c d e f a b c d e f 3 4 3 4] 22:32:41 main.go:60: 删除第i个元素DeleteByIndexString: 22:32:41 main.go:61: m删除下标为3的元素后的结果为: 22:32:41 main.go:62: [a b c e f a b c d e f 3 4 3 4] 22:32:41 main.go:63: m为: 22:32:41 main.go:64: [a b c d e f a b c d e f 3 4 3 4] 22:32:41 main.go:68: 删除一段元素DeleteByIndexString: 22:32:41 main.go:69: m删除下标从3到5(不包含5)的元素后的结果为: 22:32:41 main.go:70: [a b c f a b c d e f 3 4 3 4] 22:32:41 main.go:71: m为: 22:32:41 main.go:72: [a b c d e f a b c d e f 3 4 3 4] 22:32:41 main.go:76: 是否包含ContainsString: 22:32:41 main.go:77: m是否包含元素a true 22:32:41 main.go:78: m是否包含元素x false 22:32:41 main.go:79: m为: 22:32:41 main.go:80: [a b c d e f a b c d e f 3 4 3 4] 22:32:41 main.go:84: 去重复DistinctString: 22:32:41 main.go:85: m去重复后的结果为: 22:32:41 main.go:86: [a b c d e f 3 4] 22:32:41 main.go:87: m为: 22:32:41 main.go:88: [a b c d e f a b c d e f 3 4 3 4] 22:32:41 main.go:97: 内连接innerJoinString: 22:32:41 main.go:98: m与n内连接结果为: 22:32:41 main.go:99: [b c d e f 3] 22:32:41 main.go:100: m为: 22:32:41 main.go:101: [a b c d e f a b c d e f 3 4 3 4] 22:32:41 main.go:102: n为: 22:32:41 main.go:103: [b c d e f g b c d e f g 0 2 3 2 3] 22:32:41 main.go:107: 合并去重UnionString: 22:32:41 main.go:108: m与n合并去重结果为: 22:32:41 main.go:109: [a b c d e f 3 4 g 0 2] 22:32:41 main.go:110: m为: 22:32:41 main.go:111: [a b c d e f a b c d e f 3 4 3 4] 22:32:41 main.go:112: n为: 22:32:41 main.go:113: [b c d e f g b c d e f g 0 2 3 2 3] 22:32:41 main.go:117: 相减NotInString: 22:32:41 main.go:118: m-n结果为: 22:32:41 main.go:119: [a a 4 4] 22:32:41 main.go:120: m为: 22:32:41 main.go:121: [a b c d e f a b c d e f 3 4 3 4] 22:32:41 main.go:122: n为: 22:32:41 main.go:123: [b c d e f g b c d e f g 0 2 3 2 3] 22:32:41 main.go:132: 倒序ReverseString: 22:32:41 main.go:134: m为: 22:32:41 main.go:135: [4 3 4 3 f e d c b a f e d c b a] 22:32:41 main.go:139: 排序SortString: 22:32:41 main.go:141: m为: 22:32:41 main.go:142: [3 3 4 4 a a b b c c d d e e f f] 22:32:41 main.go:146: 随机打乱ShufflingString: 22:32:41 main.go:148: m为: 22:32:41 main.go:149: [b c 4 3 4 e c a 3 a e b f d f d] 22:32:41 main.go:151: m为: 22:32:41 main.go:152: [a a 4 b 3 f 3 e c 4 d c d b f e] ```

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4849 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传