Как я могу построить набор? - PullRequest
0 голосов
/ 08 октября 2018

Учитывая массив 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 голосов
/ 08 октября 2018

Использование map[float64]bool (или map [float64] struct {}) работает хорошо , если вам не нужно иметь NaN в наборе, и в этом случае он потерпит неудачу.

Float множествнужна дополнительная логика для обработки случая NaN, так как NaN могут использоваться в качестве индексов карты, но не работают должным образом.

Вы должны определить свой собственный FloatSet, который состоит из двух полей: Одно map[float64]struct{} для всех «нормальных»float (включая Infs) и одно hasNaN bool поле для NaN.Для вставки, поиска, удаления кода требуется как дополнительный путь к коду для обработки NaN.

«Счастливый» путь прекрасно описан в ответе icza, но для плавающих всегда требуется специальная обработка для NaN.(Если ваш набор никогда не будет содержать NaN, пока он не будет содержать NaN, и ваш код не будет выполнен с трудно обнаружимой ошибкой.)

...