【问题标题】:How can I build a set?我怎样才能建立一个集合?
【发布时间】:2018-10-08 09:12:16
【问题描述】:

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

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

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]

【问题讨论】:

标签: go data-structures set


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多