go - 我怎样才能建立一个集合?

标签 go data-structures set

给定一个 float64 数组(或任何其他东西),我想构建一个 set 类似于我们在 python 中找到的集合。设计此类数据结构的最佳方法是什么?

到目前为止,我设法使用 map 构建了一个集合,但重新利用 map 来构建集合似乎很尴尬。

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]

最佳答案

使用 map[float64]bool(或 map[float64]struct{})效果很好除非您需要在集合中包含 NaN,在这种情况下它将失败。

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

您应该定义自己的 FloatSet,它由两个字段组成:一个用于所有“正常” float (包括 Infs)的 map[float64]struct{} 和一个 hasNaN bool NaN 的字段。 Insert、Lookup、Remove 代码都需要额外的代码路径来处理 NaN。

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

关于go - 我怎样才能建立一个集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52698924/

相关文章:

go - 在 Gorilla/Mux 中反转子路由器

algorithm - 带有摊销常数或对数插入的列表 : how fast can possibly be lookup?

python - 将嵌套列表分成具有不相交元素的组

function - 查找表中元素的每个组合(Lua/伪代码)

python - 为非卡住集设置成员资格

C# 注册表子键双字值

rest - 无法使用golang中的gorilla mux从url读取变量

go - 在 Cadence 工作流程中的循环内调用相同的事件

go - 调用中的参数过多

algorithm - 什么是可用于有效查找对象是否与一组模式中的任何一个匹配的算法/结构?