Я хочу отсортировать объект 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?
Вы можете потратить минуту и выполнить поиск в Интернете по сортировке строк.
Проблема в том, что если у вас есть список таких строк, как 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
Есть и другие решения, но с этих двух стоит начать.
Спасибо, Джей, после многократного зацикливания и взрыва я смог понять это.