如何在Realm中对WBS格式字符串进行排序?

时间:2019-05-28 07:45:57

标签: swift string sorting numbers realm

我想使用其属性之一对Realm对象进行排序。它具有类似WBS的格式(1.1.3、1.1.11等),并使用String作为其类型。

我正在使用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 个答案:

答案 0 :(得分:0)

您可能需要花一点时间并在Internet上搜索排序字符串。

问题是,如果您有一个像这样的字符串列表: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
    }
}

然后按第一,第二和第三排序。为了获得在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

还有许多其他解决方案,但这两个是一个起点。