Mat*_*Car 12 sorting dictionary swift
我知道这个话题已经讨论过但是我无法解决其他答案,所以提前抱歉我的成熟!
我需要按键对这个词典进行排序
codeValueDict = ["us": "$", "it": "€", "fr": "€"]
Run Code Online (Sandbox Code Playgroud)
所以我需要一本这样的字典
sortedDict = ["fr": "€", "it": "€", "us": "$"]
Run Code Online (Sandbox Code Playgroud)
但我做不到.
我试过这个
let sortedKeysAndValues = sorted(dictionary) { $0.0 < $1.0 }
Run Code Online (Sandbox Code Playgroud)
但是在我需要从这个字典(键和值)创建两个数组之后,使用该解决方案
codesArray = sortedKeysAndValues.keys.array
Run Code Online (Sandbox Code Playgroud)
给我错误'[(String,String)]'没有名为'keys'的成员,因为该解决方案不会返回完全字典.
所以我试了另一个解决方案
let prova = codiceNomeDict as NSDictionary
for (k,v) in (Array(codiceNomeDict).sorted {$0.1 < $1.1}) {
let value = "[\"\(k)\": \"\(v)\"]"
println(value)
}
Run Code Online (Sandbox Code Playgroud)
哪个有效,但后来我不知道如何创建一个新的价值字典s.
什么是最好的解决方案?如何使其工作?
Duy*_*Hoa 19
sorted上面函数的输出是一个数组.所以你不能像字典一样得到键和值.但是您可以使用map函数来检索那些排序的键和值
返回一个包含
source{dependent} 的已排序元素的Array .排序算法不稳定(可以改变isOrderedBefore不建立顺序的元素的相对顺序).
let codeValueDict = ["us": "$", "it": "€", "fr": "€"]
let sortedArray = sorted(codeValueDict, {$0.0 < $1.0})
print(sortedArray)
let keys = sortedArray.map {return $0.0 }
print(keys)
let values = sortedArray.map {return $0.1 }
print(values)
Run Code Online (Sandbox Code Playgroud)
字典不是订购的.如果你想按顺序枚举它们,你可以使用@ HoaParis的解决方案(这是我的偏好),或者也可以
for (k,v) in sorted(codiceNomeDict, {$0.1 < $1.1}) { ... }
Run Code Online (Sandbox Code Playgroud)
这比你之前做的好一点,因为它不会生成临时数组.
但是如果你真的想要"一个将一个值映射到另一个值并按其键排序"的集合,那么你需要为此创建一些其他数据结构.所以,让我们这样做.这是一个很好的学习经历.
这个版本只是实现SequenceType并提供了一个get/set下标,这是你通常想要的大部分内容.使其成为一个完整的CollectionType是一个有点疼痛,我认为,既然startIndex和endIndexHAE是O(1).可能; 比我今天早上要做的还要多.
注意主要的补充Key: Comparable.这就是为什么Dictionary 不能订购.没有承诺你可以对他们的钥匙进行排序.通过添加该要求,我们可以.
struct SortedDictionary<Key: Hashable, Value where Key: Comparable>: SequenceType {
private var dict: Dictionary<Key, Value>
init(_ dict: Dictionary<Key, Value>) {
self.dict = dict
}
func generate() -> GeneratorOf<(Key, Value)> {
let values = Array(zip(self.dict.keys, self.dict.values))
.sorted {$0.0 < $1.0 }
return GeneratorOf(values.generate())
}
subscript(key: Key) -> Value? {
get { return self.dict[key] }
set(value) { self.dict[key] = value }
}
}
var codeValueDict = ["us": "$", "it": "€", "fr": "€"]
var sortedDict = SortedDictionary(codeValueDict)
for (k, v) in sortedDict {
println("\(k) => \(v)")
}
sortedDict["us"]
sortedDict["ab"] = "!"
sortedDict
Run Code Online (Sandbox Code Playgroud)
SortedDictionary你已经拥有的时候为什么要打扰sorted()?好吧,通常我不会.但它确实提供了抽象的机会.您可以在创建对象时控制排序顺序,而不是在对象枚举时控制排序顺序.你可能会缓存排序顺序(虽然我怀疑在大多数情况下会伤害而不是帮助).
但我建议sorted一般使用.
| 归档时间: |
|
| 查看次数: |
18276 次 |
| 最近记录: |