我以前曾排序一个唯一的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})
答案 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"])]
如果这不是您想要的,应该很容易看到如何进行调整。 结构和顺序是正确的,因此,如果数据不是所需的格式,则可以更改它。例如,如果您不喜欢键名中的前导零,则可以轻松摆脱它。