通过实例学习如何创建Set数据结构

117 阅读3分钟

这篇文章涵盖了Go语言中Set数据结构的实现及实例

如何在Golang中创建一个Set?

Set是一个一般的数据结构,包含元素的集合,不允许有重复的元素。一些编程语言如java有内置的Set支持。

在编程语言中,Set是一种计算机数据结构,实现了数学上最好的概念。一般来说,Set是一个无序的列表,没有重复的。在Golang中,我们可以使用Map类型来实现Set类型。

你可以使用Map 类型来实现set
Golang没有内置的对set 的支持,因为没有可用的泛型。我们可以写一个自定义代码来写一个 Map 实现。

语法

var myset map[type]struct{} or  
var myset map[type]bool  

我们可以使用map[type]struct{}而不是map[type]bool,原因是空的struct需要0字节,bool在内存中需要1字节的大小。

关键是你要创建的数据的类型

Struct{} 是空结构的大小为0字节

和其他数据结构一样,集合也可以进行操作--创建一个集合,遍历这些元素,添加元素,删除元素,清除集合,集合的大小,检查元素在集合中的存在。

我们将看到一个集合的基本功能

  • 创建和声明一个集合

例如,让我们创建一个接受字符串值的空集合

s1 := make(map[string]struct{})  

这是一个空的集合,它有字符串的键和空的结构--struct{}。

您可以使用添加元素到地图的语法将元素添加到集合中,地图声明一个空结构,将其作为集合地图中的一个值,键为字符串。

 var empty = struct{}{}  
	s1["one"] = empty  
	s1["two"] = empty  
	s1["three"] = empty  
	fmt.Println(s1)      // map[three:{} one:{} two:{}]  
	fmt.Println(len(s1)) // 3 

上面的代码向集合中添加了三个元素 一旦数据被添加到集合中,我们将看到迭代

  • 集合元素的迭代

你可以使用带有范围形式的for循环来迭代一个集合的元素。

for v := range s1 {  
		fmt.Println(v)  
	} 

当你多次运行上述代码时,元素的顺序是不确定的,输出如下

  • 检查元素是否存在于一个集合中

我们可以使用两个值的表达式来检查一个集合中的元素,使用从map中获取的项目

这将返回两个值,第一个值是空结构,不是必须的,所以用空白标识符(_)代替,第二个参数是一个布尔值--如果存在,返回ok=true,如果不存在,返回ok=false。

  
if _, ok := s1["one"]; ok {  
		fmt.Println("exists in a set ") //  Element exists  
	}  
	if _, ok := s1["ten"]; ok {  
		fmt.Println("Not exists in a set.") //  Element not exists  
	}  

输出结果是

exists in a set 
  • 删除一个集合中的一个元素

你可以使用map的delete()函数来删除一个集合中的元素。

delete(s1, "one")  
	fmt.Println(len(s1)) // 2  

集合实例 - 基本操作

下面是一个完整的集合实例,包括所有的基本操作

package main  
  
import (  
	"fmt"  
)  
  
func main() {  
	s1 := make(map[string]struct{})  
	fmt.Println(s1) // map[]  
	//Adding elements to Set  
	var empty = struct{}{}  
	s1["one"] = empty  
	s1["two"] = empty  
	s1["three"] = empty  
	fmt.Println(s1)      // map[three:{} one:{} two:{}]  
	fmt.Println(len(s1)) // 3  
  
	for v := range s1 {  
		fmt.Println(v)  
	}  
  
	if _, ok := s1["one"]; ok {  
		fmt.Println("exists in a set ") //  Element exists  
	}  
	if _, ok := s1["ten"]; ok {  
		fmt.Println("Not exists in a set.") //  Element not exists  
	}  
	delete(s1, "one")  
	fmt.Println(len(s1)) // 2  
  
}  

输出是

map[]  
map[two:{} three:{} one:{}]  
3  
one  
two  
three  
exists in a set  
2