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. 如何查看centos系统cpu/内存使用情况

    1.查看硬盘 [mushme@investide ~]$ df -ah 文件系统              容量  已用 可用 已用% 挂载点 /dev/cciss/c0d0p1     123G   ...

  2. TCP 远程执行CMD (解决粘包问题) 代码

    服务端 from socket import * import subprocess,json,struct server= socket(AF_INET,SOCK_STREAM) server.bi ...

  3. Best quotes from The Vampire Diary(《吸血鬼日记》经典台词)

    1. I will start fresh, be someone new. 1. 我要重新开始,做不一样的自己. 2. It's the only way I'll make it through. ...

  4. C++ one more time

    写在前面:我们学习程序设计的方法先是模仿,然后举一反三.在自己的知识面还没有铺开到足够解决本领域的问题时,不要将精力过分集中于对全局无足轻重的地方!!! 以下参考钱能老师的<C++程序设计教程 ...

  5. 并发之AQS原理(三) 如何保证并发

    并发之AQS原理(三) 如何保证并发 1. 如何保证并发 AbstractQueuedSynchronizer 维护了一个state(代表了共享资源)和一个FIFO线程等待队列(多线程竞争资源被阻塞时 ...

  6. hdu5178 尺取

    会爆int /* 给定数轴上一些点对,问有多少点对之间的距离差不超过k 点对排序后尺取法:枚举每个左边界,找到一个右边界使得 */ #include<bits/stdc++.h> #def ...

  7. 【C++ Primer 第7章】定义抽象数据类型

    参考资料 1. C++Primer #7 类 Sales_data类 Sales_data.h #include<iostream> #include<string> clas ...

  8. ef 数据库连接字符串加密

    public testContext() : base(GetConnection(), true) { } public static DbConnection GetConnection() { ...

  9. GItlab作CI/CD时,想快点,有啥招?

    如果希望.m2文件有存缓,或是不要每次从dockerhub上找镜像(有的是本地镜像,远程没有的) 那么,gitlab-runner的config.toml初步优化文件如下: concurrent = ...

  10. [转] 插件兼容CommonJS, AMD, CMD 和 原生 JS

    模块标准 CommonJS CommonJS 有三个全局变量 module.exports 和 require.但是由于 AMD 也有 require 这个全局变量,故不使用这个变量来进行检测. 如果 ...