排序3位数字与4位数字

时间:2019-05-15 23:07:32

标签: swift

我以前曾排序一个唯一的ID,该ID由两个字母和三个数字组成。此唯一的ID用于将条目分组到一个分区的tableview中。

例如,使用以下代码的[un101,un098,un100,un099,un999]正常运行。

self.figuresByLetter = Dictionary(grouping: self.figures, by: { String($0.number[2])}).sorted(by: {$0.0 < $1.0})

结果为[(键:“ 0”,值:un098,un099),(键:“ 1”,值:un100,un101),(键:“ 9”,值:un999)]

当条目数超过1,000时,我在前面的条目中添加了前导零。我尝试将代码更新为:

self.figuresByLetter = Dictionary(grouping: self.figures, by: { String($0.number[3])}).sorted(by: {$0.0 < $1.0})

现在结果为[(键:“ 0”,值:un0098,un0099,un1000,un1001),(键:“ 1”,值:un0100,un0101),(键:“ 9”,值:un0999 )]

我该怎么做才能使输入顺序正确?

更新: 我想出了一种简单的方法来准确地完成我想要的。

 self.figuresByLetter = Dictionary(grouping: self.figures, by: { String($0.number.prefix(4))}).sorted(by: {$0.0 < $1.0})

1 个答案:

答案 0 :(得分:0)

如果“每个条目的两个字母都相同”并且如果始终有四个数字,则只需排序:

let input = ["un0098", "un0099", "un1000", "un1001", "un1002", "un0100", "un0101"]
let output = input.sorted()
output // ["un0098", "un0099", "un0100", "un0101", "un1000", "un1001", "un1002"]

如您所见,这是正确的答案。

基于此,现在,您可以继续将其分组为字典并按键排序,如下所示:

let input = ["un0098", "un0099", "un1000", "un1001", "un1002", "un0100", "un0101"]
let output = input.sorted()

let d = Dictionary(grouping: output, by: { s -> String in
    let ix = s.index(s.startIndex, offsetBy:2)
    let ix2 = s.index(ix, offsetBy:2)
    return String(s[ix..<ix2])
})
let model = d.sorted{$0.key < $1.key}

现在model适合用作表视图的数据源:

[(key: "00", value: ["un0098", "un0099"]), 
 (key: "01", value: ["un0100", "un0101"]), 
 (key: "10", value: ["un1000", "un1001", "un1002"])]

如果这不是您想要的,应该很容易看到如何进行调整。 结构顺序是正确的,因此,如果数据不是所需的格式,则可以更改它。例如,如果您不喜欢键名中的前导零,则可以轻松摆脱它。