Mic*_*ael 3 set go data-structures
给定一个 float64 数组(或任何其他东西),我想构建一个set类似于我们在 python 中找到的集合。设计这种数据结构的最佳方法是什么?
到目前为止,我设法使用地图构建了一个集合,但是重新利用地图来构建一个集合似乎很尴尬。
package main
import (
"fmt"
"sort"
)
func main() {
var scores = []float64{
12.0, 6.0, 19.0, 20.0, 2.0, 8.0, 20.0,
}
set := make(map[float64]bool)
for _, t := range scores {
set[t] = true
}
unk := make([]float64, 0, len(set))
for t := range set {
unk = append(unk, t)
}
sort.Float64s(unk)
fmt.Println(unk)
}
Run Code Online (Sandbox Code Playgroud)
会产生
[2 6 8 12 19 20]
使用map[float64]bool(或 map[float64]struct{}) 效果很好,除非您需要在集合中包含 NaN,在这种情况下它会失败。
浮点集需要额外的逻辑来处理 NaN 情况,因为 NaN 可以用作地图索引但不能按预期工作。
您应该定义自己的 FloatSet,它由两个字段组成:一个map[float64]struct{}用于所有“正常”浮点数(包括 Inf),一个hasNaN bool用于 NaN。插入、查找、删除代码都需要一个额外的代码路径来处理 NaN。
icza 的答案完美地涵盖了“快乐”路径,但浮动总是需要对 NaN 进行特殊处理。(除非您的集合永远不会包含 NaN,直到它包含 NaN 并且您的代码将因难以检测的错误而失败。)