Множественная сортировка с помощью Alpabet и быстрый подсчет

Мне нужно несколько видов массива, но это не работает

Это ожидаемый результат. теперь этот массив перепутан

struct Variant {
    var name: String
    var count: Int
}


let array = [
    Variant(name: "Ab", count: 12),
    Variant(name: "Ac", count: 10),
    Variant(name: "Ad", count: 8),
    Variant(name: "Ae", count: 0)
    Variant(name: "Bc", count: 55),
    Variant(name: "Bd", count: 45)]

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

array = array.sorted(by: {
    ($0.count ?? 0, $1.name) > ($1.count ?? 0, $0.name)
})

Показать ожидаемый результат

udi 11.01.2023 06:42

Это ожидаемый результат. теперь это перепутано let array = [ Variant(name: "Ab", count: 12), Variant(name: "Ac", count: 10), Variant(name: "Ad", count: 8), Variant( имя: "Bc", количество: 55), Вариант (имя: "Bd", количество: 45)]

Vadim 11.01.2023 06:45

Я разместил ответ. Если вы хотите отдать предпочтение алфавитной сортировке, просто поменяйте порядок проверки условий, и вы получите желаемый результат.

Lokesh SN 11.01.2023 06:50

Сравнение кортежей — хороший подход, но он должен быть ($0.name, $1.count) < ($1.name, $0.count) для вашей цели.

Martin R 11.01.2023 07:28
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
1
4
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Обновлено: благодаря Мартину Р., указавшему на ошибку, вот исправленный код:

array.sorted(by: {
    //First layer of filter. Sorts based on alphabetic order
    if $0.name < $1.name {
        return true
    }
    else if $0.name > $1.name {
        return false
    }
    //Second layer. Sorts based on greater count
    return $0.count > $1.count
})

Вход:

let array = [
    Variant(name: "Bd", count: 55),
    Variant(name: "Bc", count: 55),
    Variant(name: "Ac", count: 12),
    Variant(name: "Ab", count: 12),
    Variant(name: "Ad", count: 8),
    ]

После сортировки:

Variant(name: "Ab", count: 12),
Variant(name: "Ac", count: 12),
Variant(name: "Ad", count: 8),
Variant(name: "Bc", count: 55), 
Variant(name: "Bd", count: 55)

К сожалению, это не тот результат, которого я хочу. У меня должна быть группа по первой букве алфавита. Например, A, затем от наибольшего к наименьшему счету в A. И затем B, и так далее.

Vadim 11.01.2023 06:57

Вариант (имя: «Ab», количество: 55), Вариант (имя: «Ac», количество: 12), Вариант (имя: «Ad», количество: 8), Вариант (имя: «Bc», количество: 55 ), Вариант(название: "Бд", количество: 30)

Vadim 11.01.2023 06:58

Я отредактировал ответ. Думаю, это должно удовлетворить ваши требования. Как я уже сказал, вам просто нужно выполнить свои if проверки на основе приоритета сортировки.

Lokesh SN 11.01.2023 07:01

Это неправильно. Прежде чем проверять второй слой, вы должны определить, определяет ли первый слой порядок. Поэтому вы должны проверить как $0.name < $1.name, так и $0.name > $1.name, прежде чем сравнивать подсчеты.

Martin R 11.01.2023 07:23

Этого можно добиться с помощью сравнения кортежей, как уже пробовали в вопросе, только это должно быть ($0.name, $1.count) < ($1.name, $0.count)

Martin R 11.01.2023 07:27

@MartinR Кроме того, ОП хочет, чтобы сортировка производилась по порядку «возрастающее имя» и «число по убыванию». Вот почему я предложил текущий подход

Lokesh SN 11.01.2023 07:46

Сравнение кортежей — хороший подход к сортировке элементов по нескольким критериям, но вы неправильно определили порядок элементов кортежа.

Кортежи сравниваются в «лексикографическом порядке», начиная с первого (самого левого) элемента. Чтобы сначала отсортировать по имени, $0.name соотв. $1.name должен быть первым элементом кортежа.

Поэтому для упорядочения сначала по имени (по возрастанию), а затем по количеству (по убыванию) функция сортировки должна быть

array.sorted(by: {
    ($0.name, $1.count) < ($1.name, $0.count)
})

Другие вопросы по теме