如何建立一套?

时间:2018-10-08 09:12:17

标签: go data-structures set

给出一个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)
}

会产生

  

[2 6 8 12 19 20]

1 个答案:

答案 0 :(得分:3)

使用map[float64]bool(或map [float64] struct {})效果很好除非,您需要在集合中设置NaN,否则将失败。

浮点集需要额外的逻辑来处理NaN情况,因为NaN可以用作地图索引,但不能按预期工作。

您应该定义自己的FloatSet,它由两个字段组成:一个map[float64]struct{}用于所有“普通”浮点(包括Infs),一个hasNaN bool字段用于NaN。插入,查找,删除代码都需要一条额外的代码路径来处理NaN。

icza的回答完全涵盖了“快乐”的道路,但浮动车始终需要对NaN进行特殊处理。 (除非您的集合永远不会包含NaN,直到它包含一个NaN并且您的代码将因难以检测到的错误而失败。)