Как отсортировать строку формата WBS в Realm?

Я хочу отсортировать объект Realm, используя одно из его свойств. Он имеет формат, подобный WBS (1.1.3, 1.1.11 и т. д.), с использованием строки в качестве типа.

Я использую RealmSwift 3.11.2 и уже пробовал использовать sorted(by:), и это работает! Но 1.1.10 и 1.1.11 будут отсортированы раньше 1.1.2.

Это код, который я использую

tasks = tasks.sorted(byKeyPath: "wbs", ascending: true)

Я ожидаю, что вывод будет упорядочен правильно, например [1.1.2, 1.1.10, 1.1.11].

Любая помощь приветствуется, я здесь ничего не понимаю, могу ли я сделать это в Realm?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете потратить минуту и ​​выполнить поиск в Интернете по сортировке строк.

Проблема в том, что если у вас есть список таких строк, как 1, 2, 3, 10, и они отсортированы, они будут сортироваться по 1, 10, 2, 3.

Это связано с тем, как сортируются строки; для этого примера они обычно сортируются по первой букве/объекту в строке (1), а затем по второй букве (0) и так далее, поэтому строки, начинающиеся с 1, группируются. Потом 2 и т.д.

Поэтому вам нужно либо дополнить их, чтобы форматы были такими же, как

01.01.02, 01.01.10, 01.01.11 etc

который будет правильно сортировать или хранить три раздела в отдельных свойствах как числа (целые числа)

class TriadClass {
    var first = 0
    var second = 0
    var third = 0

    init(x: Int, y: Int, z: Int) {
        self.first = x
        self.second = y
        self.third = z
    }

    func getPaddedString() -> String {
        let formatter = NumberFormatter()
        formatter.format = "00"

        let firstNum = NSNumber(value: self.first)
        let secondNum = NSNumber(value: self.second)
        let thirdNum = NSNumber(value: self.third)

        let firstString = formatter.string(from: firstNum)
        let secondString = formatter.string(from: secondNum)
        let thirdString = formatter.string(from: thirdNum)

        let finalString = "\(firstString!).\(secondString!).\(thirdString!)"

        return finalString
    }

    func getPureString() -> String {
        let formatter = NumberFormatter()
        formatter.format = "0"

        let firstNum = NSNumber(value: self.first)
        let secondNum = NSNumber(value: self.second)
        let thirdNum = NSNumber(value: self.third)

        let firstString = formatter.string(from: firstNum)
        let secondString = formatter.string(from: secondNum)
        let thirdString = formatter.string(from: thirdNum)

        let finalString = "\(firstString!).\(secondString!).\(thirdString!)"

        return finalString
    }
}

Затем отсортируйте по первому, второму и третьему. Чтобы получить число для отображения в пользовательском интерфейсе, я включил функции для их форматирования. Обратите внимание, что обе функции можно было бы значительно улучшить и сократить, если бы я оставил их подробными, чтобы вы могли пройти через них.

Использование будет

let myNum = TriadClass(x: 1, y: 1, z: 10)
let paddedString = myNum.getPaddedString()
print(paddedString)

let nonPaddedString = myNum.getPureString()
print(nonPaddedString)

и вывод

01.01.10
1.1.10

Есть и другие решения, но с этих двух стоит начать.

Спасибо, Джей, после многократного зацикливания и взрыва я смог понять это.

odin_123 14.06.2019 09:04

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