Golang 实现 set 集合,变相实现 切片去重、排序 功能
Java 中的集合(set)去重很方便,PHP 中的数组值去重,就更加方便,一个函数搞定:array_unique(),Golang 中就比较苦逼了,官方没有提供对“切片去重”的功能,而项目中,又经常用到这个功能,,我们可以模拟 Java 集合的功能,实现 Golang 版集合的同时,顺便把 去重 和 排序 做了,它的主要实现原理是:利用 map 数据 不允许键重名 的特点
,参考代码如下:
# set_int.go
package utils import (
"sort"
"sync"
) // 实现 set 集合,变相实现 切片去重
// by phpgo.cnblogs.com
type IntSet struct {
m map[int]bool
sync.RWMutex
} func NewIntSet() *IntSet {
return &IntSet{
m: map[int]bool{},
}
} func (s *IntSet) Add(items ...int) {
s.Lock()
defer s.Unlock()
if len(items) == 0 {
return
}
for _, item := range items {
s.m[item] = true
}
} func (s *IntSet) Remove(items ...int) {
s.Lock()
defer s.Unlock()
if len(items) == 0 {
return
}
for _, item := range items {
delete(s.m, item)
}
} func (s *IntSet) Has(item int) bool {
s.RLock()
defer s.RUnlock()
_, ok := s.m[item]
return ok
} func (s *IntSet) Len() int {
return len(s.List())
} func (s *IntSet) Clear() {
s.Lock()
defer s.Unlock()
s.m = map[int]bool{}
} func (s *IntSet) IsEmpty() bool {
if s.Len() == 0 {
return true
}
return false
} func (s *IntSet) List() []int {
s.RLock()
defer s.RUnlock()
list := []int{}
for item := range s.m {
list = append(list, item)
}
return list
} func (s *IntSet) SortList() []int {
s.RLock()
defer s.RUnlock()
list := []int{}
for item := range s.m {
list = append(list, item)
}
sort.Ints(list)
return list
}
# set_string.go
package utils import (
"sort"
"sync"
) // 实现 set 集合,变相实现 切片去重
// by 52php.cnblogs.com
type StringSet struct {
m map[string]bool
sync.RWMutex
} func NewStringSet() *StringSet {
return &StringSet{
m: map[string]bool{},
}
} func (s *StringSet) Add(items ...string) {
s.Lock()
defer s.Unlock()
if len(items) == 0 {
return
}
for _, item := range items {
s.m[item] = true
}
} func (s *StringSet) Remove(items ...string) {
s.Lock()
defer s.Unlock()
if len(items) == 0 {
return
}
for _, item := range items {
delete(s.m, item)
}
} func (s *StringSet) Has(item string) bool {
s.RLock()
defer s.RUnlock()
_, ok := s.m[item]
return ok
} func (s *StringSet) Len() int {
return len(s.List())
} func (s *StringSet) Clear() {
s.Lock()
defer s.Unlock()
s.m = map[string]bool{}
} func (s *StringSet) IsEmpty() bool {
if s.Len() == 0 {
return true
}
return false
} func (s *StringSet) List() []string {
s.RLock()
defer s.RUnlock()
list := []string{}
for item := range s.m {
list = append(list, item)
}
return list
} func (s *StringSet) SortList() []string {
s.RLock()
defer s.RUnlock()
list := []string{}
for item := range s.m {
list = append(list, item)
}
sort.Strings(list)
return list
}
# 应用示例:
package main import (
"utils"
"fmt"
) func main() { // int 集合
s := utils.NewIntSet() // 添加数据
s.Add(5, 2, 4, 3, 5, 6, 7) // 去重后的值
fmt.Println(s.List()) // 排序后的值
fmt.Println(s.SortList()) // string 集合
s2 := utils.NewStringSet() // 添加数据
s2.Add("wen", "jian", "bao", "study", "goalng", "bao", "jian") // 去重后的值
fmt.Println(s2.List()) // 排序后的值
fmt.Println(s2.SortList())
}
Golang 实现 set 集合,变相实现 切片去重、排序 功能的更多相关文章
- Golang语言系列-05-数组和切片
数组和切片 数组 概念 数组是同一种数据类型元素的集合:数组的长度必须是常量,并且长度是数组类型的一部分,一旦定义,长度不能变 例如:[5]int 和 [10]int 是不同的数组类型 使用时可以修改 ...
- 分享一种容易理解的js去重排序方法
<script> var arr=[1,8,6,4,88,22,99,4,6,86,5,58,89,5]; //先使用sort()函数去重 var a=arr.sort(function ...
- linux下批量修改存有超大数据量IP文件中的IP内容以及去重排序
作为一个linux的学徒,分享一下自己解决这个小问题的心得,在处理这个问题时使用了一个小技巧感觉很适用,个人发觉linux的终端真滴是非常强大,下面就详细地介绍这个问题以及解决办法吧 问题描述:由于要 ...
- 对list集合中的对象进行排序(转载)
原文链接:http://blog.csdn.net/veryisjava/article/details/51675036 Collections对List集合中的数据进行排序 有时候需要对集合中的元 ...
- Java Map集合按照key和value排序之法
一.理论基点 Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等. TreeMap:基于红黑树(Red-Black-Tre ...
- for循环去重排序
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Java:List集合内的对象进行排序
List集合中的对象进行排序,除了for外,还有java的Collections对象来对摸个集合进行排序的用法. 比如说我有一个List集合,集合元素为: public class TaskAutoE ...
- group by具有去重的功能
group by具有去重的功能
- 去重+排序板子(set+map)
题意: 给定n个数,去重排序后输出个数和每个数 1.map实现 #pragma GCC optimize("O2") #include<iostream> #inclu ...
随机推荐
- 14-jQuery补充
jquery内容补充 jquery除了咱们上面讲解的常用知识点之外,还有jquery 插件.jqueryUI知识点 jqueryUI 官网: https://jqueryui.com/ jqueryU ...
- vue系列之vue-resource
vue-resource是Vue.js的一款插件,它可以通过XMLHttpRequest或JSONP发起请求并处理响应.也就是说,$.ajax能做的事情,vue-resource插件一样也能做到,而且 ...
- 在listView中的模糊查询和删除
- [转]清理ambari安装的hadoop集群
本文针对redhat或者centos 对于测试集群,如果通过ambari安装Hadoop集群后,想重新再来一次的话,需要清理集群. 对于安装了很多hadoop组件的话,这个工作很繁琐.接下来是我整理的 ...
- AlexNet
AlexNet学习笔记 目录 AlexNet整体结构 CNN 全连接 TensorFlow实现 AlexNet是2012年ImageNet竞赛冠军获得者Hinton和他的学生Alex Krizhevs ...
- cf932d 树上倍增
题解链接 https://blog.csdn.net/my_sunshine26/article/details/79338601 感觉能做,但是倍增还不是很熟悉,回头再补
- python 全栈开发,Day70(模板自定义标签和过滤器,模板继承 (extend),Django的模型层-ORM简介)
昨日内容回顾 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 Quer ...
- Array,ArrayList,泛型List比较
在C#中数组Array,ArrayList,泛型List都能够存储一组对象,但是在开发中根本不知道用哪个性能最高,下面我们慢慢分析分析. 一.数组Array 数组是一个存储相同类型元素的固定大小的顺序 ...
- 超实用!!!使用IDEA插件Alibaba Cloud Toolkit工具一键部署本地应用到ECS服务器
最近看到阿里云发布了一款名为 Alibaba Cloud Toolkit 的插件,可以帮助开发者高效开发并部署适合在云端运行的应用,瞬间击中了我的小心脏,这个对于个人开发者来说超级棒啊,终于不需要再手 ...
- oracle <> 选不出为null的部分
比如 tablea 的 字段b 为空,则 select * from tablea where b <> 'Y' 则查不出b is null 的部分