anj*_*anb 100 set go data-structures
我正在尝试解决"去编程语言"练习#1.4,这需要我有一套.我可以创建一个集合类型,但为什么语言没有附带?go,来自谷歌,guava也来自哪里,为什么语言设计师不选择添加对基础数据结构的支持?为什么强迫你的用户创建自己的实现为一个基本的集合?
Vat*_*ine 70
部分原因是因为Go没有泛型(所以你需要为每种类型设置一种类型,或者反复使用反射,这是相当低效的).
部分地,因为如果你只需要"添加/删除单个元素到一个集合"和"相对节省空间",你可以简单地通过使用a map[yourtype]bool(并为集合中的true任何元素设置值)来获得相当一部分)或者,为了提高空间效率,您可以使用空结构作为值并使用它_, present = the_setoid[key]来检查是否存在.
Sal*_*ali 52
一个原因是从地图创建集合很容易:
s := map[int]bool{5: true, 2: true}
_, ok := s[6] // check for existence
s[8] = true // add element
delete(s, 2) // remove element
Run Code Online (Sandbox Code Playgroud)
联盟
s_union := map[int]bool{}
for k, _ := range s1{
s_union[k] = true
}
for k, _ := range s2{
s_union[k] = true
}
Run Code Online (Sandbox Code Playgroud)
路口
s_intersection := map[int]bool{}
for k,_ := range s1 {
if s2[k] {
s_intersection[k] = true
}
}
Run Code Online (Sandbox Code Playgroud)
实现所有其他设置操作并不是那么难.
就像 Vatine 写道:由于 go 缺少泛型,因此它必须成为语言的一部分,而不是标准库。为此,您将不得不使用关键字集、联合、交集、差异、子集来污染语言......
另一个原因是,根本不清楚集合的“正确”实现是什么:
有一种功能方法:
func IsInEvenNumbers(n int) bool {
if n % 2 == 0 {
return true
}
return false
}
Run Code Online (Sandbox Code Playgroud)这是一组所有偶数整数。它具有非常高效的查找和并集,相交、差异和子集可以通过功能组合轻松完成。
地图没有这个问题,因为你存储了一些与值相关的东西。
| 归档时间: |
|
| 查看次数: |
65332 次 |
| 最近记录: |