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 ...
随机推荐
- 转载:2.2 Nginx配置的通用语法《深入理解Nginx》(陶辉)
原文:https://book.2cto.com/201304/19625.html Nginx的配置文件其实是一个普通的文本文件.下面来看一个简单的例子.user nobody; worker_p ...
- Expm 1_3 数组中逆序对个数问题
有一个数的序列A[1].A[2] .A[3] .…… .A[n],若i<j,并且A[i]>A[j],则称A[i]与A[j]构成了一个逆序对,设计算法求数列A中逆序对的个数. package ...
- python读取两个csv文件数据,进行查找匹配出现次数
现有需求 表1 表2 需要拿表1中的编码去表2中的门票编码列匹配,统计出现的次数,由于表2编码列是区域间,而且列不是固定的,代码如下 #encoding:utf-8 ##导入两个CSV进行比对 imp ...
- flexible array柔性数组、不定长的数据结构Struct详解
柔性数组,这个名词对我来说算是比较新颖的,在学习跳跃表的实现时看到的.这么好听的名字,的背后到底是如何的优雅. 柔性数组,其名称的独特和迷惑之处在于“柔性”这个词.在C/C++中定义数组,是一个定长的 ...
- mockito简单教程
注:本文来源:sdyy321的<mockito简单教程> 官网: http://mockito.org API文档:http://docs.mockito.googlecode.com/h ...
- js字符串转换成数字与数字转换成字符串的实现方法
转载:点击查看地址 js字符串转换成数字 将字符串转换成数字,得用到parseInt函数.parseInt(string) : 函数从string的开始解析,返回一个整数. 举例:parseInt(' ...
- python3 读取文件跳过文件第一行内容
Python编程时,经常需要跳过第一行读取文件内容.比较容易想到是为每行设置一个line_num,然后判断line_num是否为1,如果不等于1,则进行读取操作.相应的Python代码如下: #inp ...
- python简单笔记
Remarks:python中注意缩进(Tab键或者4个空格) print(输出) 格式:print(values) 字符串.数字.变量等都可以输出: 实例: print(1)->1 print ...
- ssh批量执行命令-paramiko
---恢复内容开始--- # python3.5 + paramiko # pip 是python的包管理工具,在shell里执行如下命令安装paramoko模块 # pip install para ...
- 【C语言】 二叉树的基本运算
• 二叉树节点类型BTNode: typedef struct node { char data; struct node *lchild, *rchild; } BTNode; 创建二叉树 void ...