Swift: 数字字符串字典排序
Swift: Sort Dictionary of Number Strings
我有一个数字字符串字典,如下所示:
let comph : [String : [String : String]] = [
"1":["title" : "first title"],
"2":["title" : "second title"],
"10": ["title" : "last title"]
]
然后当我使用 comph.sort { [=13=].0 < .0 }
对我的词典进行排序时,我得到了这个:
let sortedComph = comph.sort { [=12=].0 < .0 }
print(sortedComph) //["1":["title" : "first title"],"10": ["title" : "last title"],"2":["title" : "second title"]]
如何对字典进行排序,使其 returns 键按数字顺序排列?
例如:["1":["title" : "first title"],"2":["title" : "second title"],"10": ["title" : "last title"]]
谢谢'
根据定义,Swift 中的字典是未排序的集合。如果你想维持秩序,你需要使用其他类型。
但是,看起来这个人在 Swift 中写了一个 OrderedDictionary
,如果你感兴趣的话:
Learning Swift: Ordered Dictionaries
或者,一个快速又脏的解决方案是将键提取到数组中,对它们进行排序,然后遍历数组并使用键进行字典查找。
如果你愿意,你可以用一个结构数组来表示你的数据
struct Model
{
var key:String!
var title:String!
// etc...
}
然后声明该结构的数组:
var arrayOfStructure = [Model]()
然后你排序了
您示例中的 sortedComph
常量不再是字典,而是 (key, value) 元组数组。您 运行 遇到的问题是,在对字符串进行排序时,比较是在不将字符串视为数值的情况下完成的。 这就是您需要解决的问题。
处理此问题的一种方法是在比较函数中从字符串创建 Int?
实例:
let sortedComph = comph.sort { Int([=10=].0) < Int(.0) }
// [("1", ["title": "first title"]), ("2", ["title": "second title"]), ("10", ["title": "last title"])]
这样,结果数组将按字符串键中的整数值排序。任何非整数键都将在列表的开头分组,因为这就是 nil
排序的方式。
更健壮的方法可能是使用NSString.compare(:options:)
方法:
let sortedComph = comph.sort {
([=11=].0 as NSString).compare(.0, options: .NumericSearch) == .OrderedAscending
}
// [("1", ["title": "first title"]), ("2", ["title": "second title"]), ("10", ["title": "last title"])]
我有一个数字字符串字典,如下所示:
let comph : [String : [String : String]] = [
"1":["title" : "first title"],
"2":["title" : "second title"],
"10": ["title" : "last title"]
]
然后当我使用 comph.sort { [=13=].0 < .0 }
对我的词典进行排序时,我得到了这个:
let sortedComph = comph.sort { [=12=].0 < .0 }
print(sortedComph) //["1":["title" : "first title"],"10": ["title" : "last title"],"2":["title" : "second title"]]
如何对字典进行排序,使其 returns 键按数字顺序排列?
例如:["1":["title" : "first title"],"2":["title" : "second title"],"10": ["title" : "last title"]]
谢谢'
根据定义,Swift 中的字典是未排序的集合。如果你想维持秩序,你需要使用其他类型。
但是,看起来这个人在 Swift 中写了一个 OrderedDictionary
,如果你感兴趣的话:
Learning Swift: Ordered Dictionaries
或者,一个快速又脏的解决方案是将键提取到数组中,对它们进行排序,然后遍历数组并使用键进行字典查找。
如果你愿意,你可以用一个结构数组来表示你的数据
struct Model
{
var key:String!
var title:String!
// etc...
}
然后声明该结构的数组:
var arrayOfStructure = [Model]()
然后你排序了
您示例中的 sortedComph
常量不再是字典,而是 (key, value) 元组数组。您 运行 遇到的问题是,在对字符串进行排序时,比较是在不将字符串视为数值的情况下完成的。 这就是您需要解决的问题。
处理此问题的一种方法是在比较函数中从字符串创建 Int?
实例:
let sortedComph = comph.sort { Int([=10=].0) < Int(.0) }
// [("1", ["title": "first title"]), ("2", ["title": "second title"]), ("10", ["title": "last title"])]
这样,结果数组将按字符串键中的整数值排序。任何非整数键都将在列表的开头分组,因为这就是 nil
排序的方式。
更健壮的方法可能是使用NSString.compare(:options:)
方法:
let sortedComph = comph.sort {
([=11=].0 as NSString).compare(.0, options: .NumericSearch) == .OrderedAscending
}
// [("1", ["title": "first title"]), ("2", ["title": "second title"]), ("10", ["title": "last title"])]