如何在 Realm 中对 WBS 格式字符串进行排序?
How to sort WBS format string in 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 中完成吗?
您可能需要花一点时间在 Internet 上搜索一下字符串排序。
问题是,如果您有一个像 1、2、3、10 这样的字符串列表,并且对它们进行了排序,它们将排序为 1、10、2、3。
这是因为字符串的排序方式;对于此示例,它们通常按字符串 (1's) 中的第一个 letter/object 排序,然后按第二个字母 (0) 排序,依此类推,因此以 1 开头的字符串被分组。然后是 2 等等
所以你需要填充它们,这样格式就和
一样了
01.01.02, 01.01.10, 01.01.11 etc
这将正确排序或将三个部分存储在单独的属性中作为数字 (int)
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
}
}
然后按第一、第二、第三排序。为了获得在 UI 中显示的数字,我将其包含在函数中以对其进行格式化。请注意,这两个函数都可以大大改进和缩短,因为我让它们变得冗长,以便您逐步完成。
用法是
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
还有许多其他解决方案,但这两个是一个起点。
我想使用其中一个属性对我的 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 中完成吗?
您可能需要花一点时间在 Internet 上搜索一下字符串排序。
问题是,如果您有一个像 1、2、3、10 这样的字符串列表,并且对它们进行了排序,它们将排序为 1、10、2、3。
这是因为字符串的排序方式;对于此示例,它们通常按字符串 (1's) 中的第一个 letter/object 排序,然后按第二个字母 (0) 排序,依此类推,因此以 1 开头的字符串被分组。然后是 2 等等
所以你需要填充它们,这样格式就和
一样了01.01.02, 01.01.10, 01.01.11 etc
这将正确排序或将三个部分存储在单独的属性中作为数字 (int)
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
}
}
然后按第一、第二、第三排序。为了获得在 UI 中显示的数字,我将其包含在函数中以对其进行格式化。请注意,这两个函数都可以大大改进和缩短,因为我让它们变得冗长,以便您逐步完成。
用法是
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
还有许多其他解决方案,但这两个是一个起点。