Сортировать фрагмент структуры на основе порядка по номеру и по алфавиту - PullRequest
1 голос
/ 04 апреля 2020

У меня есть фрагмент структуры, подобный этому

type Interval struct{
    number     float64
    coordinate string
}

var data []Interval

Предположим, что данные похожи ниже

[]Interval{
    Interval{
        number: 1,
        coordinate: "x",
    },
    Interval{
        number: 8,
        coordinate: "y",
    },
    Interval{
        number: 2,
        coordinate: "x",
    },
    Interval{
        number: 5,
        coordinate: "y",
    },
    Interval{
        number: 5,
        coordinate: "x",
    },
    Interval{
        number: 6,
        coordinate: "y",
    },
    Interval{
        number: 3,
        coordinate: "x",
    },
    Interval{
        number: 7,
        coordinate: "y",
    },
}

Мой вопрос, как я могу отсортировать это по number и * 1008? *?

Я пытался использовать метод сортировки ниже, но это не так, как мои ожидания

// sort method that I use
sort.Slice(data, func(i, j int) bool {
    return data[i].number < data[j].number
})

результат:

[{1 x} {2 x} {3 x} {5 y} {5 x} {6 y} {7 y} {8 y}]

ожидание:

[{1 x} {2 x} {3 x} {5 x} {5 y} {6 y} {7 y} {8 y}]

diff: {5 y} {5 x} должно быть {5 x} {5 y}

Подсказки: мой результат ожидания схож с тем, что python имеет с функцией sort

действительно ценю с любой помощью

1 Ответ

1 голос
/ 04 апреля 2020

Ваша функция сравнения не сравнивает свойство coordinate в ситуации. Свойство number равно. Следовательно, позиции {5, x} и {5, y} могут быть недетерминированными c, если алгоритм сортировки нестабилен.

Вот обновленная версия функции сравнения:

sort.Slice(data, func(i, j int) bool {
    if data[i].number != data[j].number {
        return data[i].number < data[j].number
    }
    return data[i].coordinate < data[j].coordinate
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...