Swiftで辞書を並べ替えたい。私のような辞書があります:
"A" => Array[]
"Z" => Array[]
"D" => Array[]
など。
"A" => Array[]
"D" => Array[]
"Z" => Array[]
等.
私はSOで多くのソリューションを試しましたが、誰も私のために働きませんでした。私はXCode6 Beta 5を使用していますが、その一部はコンパイラエラーを発生させ、一部のソリューションは例外を発生させています。したがって、辞書ソートの作業コピーを投稿できる人は誰でも。
let dictionary = [
"A" : [1, 2],
"Z" : [3, 4],
"D" : [5, 6]
]
let sortedKeys = Array(dictionary.keys).sorted(<) // ["A", "D", "Z"]
編集:
上記のコードのソートされた配列にはキーのみが含まれますが、値は元の辞書から取得する必要があります。ただし、'Dictionary'
は(key、value)ペアの'CollectionType'
でもあり、グローバル'sorted'
関数を使用して、次のようにキーと値の両方を含むソート済み配列を取得できます。
let sortedKeysAndValues = sorted(dictionary) { $0.0 < $1.0 }
println(sortedKeysAndValues) // [(A, [1, 2]), (D, [5, 6]), (Z, [3, 4])]
EDIT2:毎月変更されるSwift構文は現在好まれています
let sortedKeys = Array(dictionary.keys).sort(<) // ["A", "D", "Z"]
グローバルsorted
は非推奨です。
Ivica Mの回答の更新バージョン:
let wordDict = [
"A" : [1, 2],
"Z" : [3, 4],
"D" : [5, 6]
]
let sortedDict = wordDict.sort { $0.0 < $1.0 }
print("\(sortedDict)") //
wordDict.sorted(by: { $0.0 < $1.0 })
注意:
結果の配列が辞書ではないことに驚く人もいます。 辞書をソートできません!結果のデータ型は、@ Ivicaの答えのように、ソートされた配列です。
キーとキー値の両方をキーのソート順で繰り返したい場合、このフォームは非常に簡潔です
let d = [
"A" : [1, 2],
"Z" : [3, 4],
"D" : [5, 6]
]
for (k,v) in Array(d).sorted({$0.0 < $1.0}) {
println("\(k):\(v)")
}
Swift 4では、よりスマートに記述できます。
let d = [ 1 : "hello", 2 : "bye", -1 : "foo" ]
d = [Int : String](uniqueKeysWithValues: d.sorted{ $0.key < $1.key })
上記のすべてを試してみました、要するに必要なのは
let sorted = dictionary.sorted { $0.key < $1.key }
let keysArraySorted = Array(sorted.map({ $0.key }))
let valuesArraySorted = Array(sorted.map({ $0.value }))
Swift 3の場合、次のソートはキーでソートされた辞書を返します。
let unsortedDictionary = ["4": "four", "2": "two", "1": "one", "3": "three"]
let sortedDictionary = unsortedDictionary.sorted(by: { $0.0.key < $0.1.key })
print(sortedDictionary)
// ["1": "one", "2": "two", "3": "three", "4": "four"]
Swift 4の場合、次のことがうまくいきました。
let dicNumArray = ["q":[1,2,3,4,5],"a":[2,3,4,5,5],"s":[123,123,132,43,4],"t":[00,88,66,542,321]]
let sortedDic = dicNumArray.sorted { (aDic, bDic) -> Bool in
return aDic.key < bDic.key
}
iOS 9およびxcode 7.3で「ソート済み」、Swift 2.2は不可能です。次のように、「ソート済み」を「ソート済み」に変更します。
let dictionary = ["main course": 10.99, "dessert": 2.99, "salad": 5.99]
let sortedKeysAndValues = Array(dictionary).sort({ $0.0 < $1.0 })
print(sortedKeysAndValues)
//sortedKeysAndValues = ["desert": 2.99, "main course": 10.99, "salad": 5.99]
Swift 3の場合、次のように機能しますが、Swift 2構文は機能しません。
// menu is a dictionary in this example
var menu = ["main course": 10.99, "dessert": 2.99, "salad": 5.99]
let sortedDict = menu.sorted(by: <)
// without "by:" it does not work in Swift 3
Swift 3はソートされます(by:<)
let dictionary = [
"A" : [1, 2],
"Z" : [3, 4],
"D" : [5, 6]
]
let sortedKeys = Array(dictionary.keys).sorted(by:<) // ["A", "D", "Z"]
これは、辞書自体をソートするためのエレガントな代替手段です。
Swift 4&5現在
let sortedKeys = myDict.keys.sorted()
for key in sortedKeys {
// Ordered iteration over the dictionary
let val = myDict[key]
}