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 集合,变相实现 切片去重、排序 功能的更多相关文章

  1. Golang语言系列-05-数组和切片

    数组和切片 数组 概念 数组是同一种数据类型元素的集合:数组的长度必须是常量,并且长度是数组类型的一部分,一旦定义,长度不能变 例如:[5]int 和 [10]int 是不同的数组类型 使用时可以修改 ...

  2. 分享一种容易理解的js去重排序方法

    <script> var arr=[1,8,6,4,88,22,99,4,6,86,5,58,89,5]; //先使用sort()函数去重 var a=arr.sort(function ...

  3. linux下批量修改存有超大数据量IP文件中的IP内容以及去重排序

    作为一个linux的学徒,分享一下自己解决这个小问题的心得,在处理这个问题时使用了一个小技巧感觉很适用,个人发觉linux的终端真滴是非常强大,下面就详细地介绍这个问题以及解决办法吧 问题描述:由于要 ...

  4. 对list集合中的对象进行排序(转载)

    原文链接:http://blog.csdn.net/veryisjava/article/details/51675036 Collections对List集合中的数据进行排序 有时候需要对集合中的元 ...

  5. Java Map集合按照key和value排序之法

    一.理论基点 Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等. TreeMap:基于红黑树(Red-Black-Tre ...

  6. for循环去重排序

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. Java:List集合内的对象进行排序

    List集合中的对象进行排序,除了for外,还有java的Collections对象来对摸个集合进行排序的用法. 比如说我有一个List集合,集合元素为: public class TaskAutoE ...

  8. group by具有去重的功能

    group by具有去重的功能

  9. 去重+排序板子(set+map)

    题意: 给定n个数,去重排序后输出个数和每个数 1.map实现 #pragma GCC optimize("O2") #include<iostream> #inclu ...

随机推荐

  1. PYTHON-匿名函数,递归与二分法,面向过程编程-练习

    # 四 声明式编程练习题 # 1.将names=['egon','alex_sb','wupeiqi','yuanhao']中的名字全部变大写names = ['egon', 'alex_sb', ' ...

  2. 大型NodeJS项目架构与优化

    使用场景: proxy(API冗余,跨域) vue ssr(服务端渲染) socket(大并发,通讯) 区块链(创业公司,新兴行业) 讨论什么? NodeJS异步IO原理及优化方案 NodeJS内存管 ...

  3. 采用busybox 代替android 自带的shell

    折腾了几天,被Android那点儿少得可怜的shell命令折磨的死去活来,终于下定了革命的决心.看一下怎么把渺小的toolbox替换成伟大的busybox吧.先大致描述一下Android系统中的she ...

  4. hdu3308

    区间合并比较模板的题,就是求一个区间的LCIS 线段树维护左最大LCIS,右最大LCIS,区间LCIS 看代码就行 #include<iostream> #include<cstri ...

  5. python+selenium六:等待相关

    显式等待(sleep): 固定的等待(死等),不管页面有没有加载完,都等设置的时间过了再做下一步操作 隐式等待 全局生效,只写一次即可(仅当前页面),缺点:如果页面一直转圈,如:js出错将等待到所设置 ...

  6. python 全栈开发,Day138(scrapy框架的下载中间件,settings配置)

    昨日内容拾遗 打开昨天写的DianShang项目,查看items.py class AmazonItem(scrapy.Item): name = scrapy.Field() # 商品名 price ...

  7. 演示Thread.sleep(100)和Thread.currentThread().isInterrupted()+@Deprecated:将方法标注为废弃的方法

    package charpter08; public class TestInterrupt01 { public static void main(String[] args) { Processo ...

  8. SqlServer索引带来的问题

    索引上的碎片影响主要有: 1.带来额外的IO 2.影响连续读 (1).索引 I/o

  9. ASS字幕制作和压制教程

    首先放上一个成品预览,本教程只讲解基础的字幕制作,特效字幕请去TCAX论坛学习.   http://www.tudou.com/programs/view/rcv33Uwf3hM/   ======= ...

  10. openstack安装-计算节点-nova计算服务安装

    一.基础服务安装 先安装基础工具 yum install net-tools vim telnet wget lrzsz 1.添加hosts解析 cat << EOF >/etc/h ...