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

标签 swift string sorting numbers realm

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

我正在使用 RealmSwift 3.11.2,并且我已经尝试使用排序(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) 排序,然后按第二个字母 (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

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

关于swift - 如何在 Realm 中对 WBS 格式字符串进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56337339/

相关文章:

mysql - 更新/更改 mysql 中字符串的特定部分?

ios - 快速按下按钮时填充按钮图标

c++ - 使用字符串或流?

string - Cassandra 中单个字符(或固定长度字符串)的数据类型

r - 在方面着色ggplot x轴

jQuery DataTables 将所有记录显示为选项

ios - 来自其他 viewController 的 func 的值

ios - 不确定如何为现有代码正确设置我的变量。 fatal error : Unexpectedly found nil while implicitly unwrapping an Optional value

ios - 具有相同变量值的多个自动布局约束

PHP array_multisort 没有正确排序第二个数组