web-dev-qa-db-ja.com

キーで辞書を並べ替える

Swiftで辞書を並べ替えたい。私のような辞書があります:

"A" => Array[]
"Z" => Array[]
"D" => Array[]

など。

"A" => Array[]
"D" => Array[]
"Z" => Array[]

等.

私はSOで多くのソリューションを試しましたが、誰も私のために働きませんでした。私はXCode6 Beta 5を使用していますが、その一部はコンパイラエラーを発生させ、一部のソリューションは例外を発生させています。したがって、辞書ソートの作業コピーを投稿できる人は誰でも。

103
Aleem Ahmad
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は非推奨です。

134
Ivica M.

Swift 2.0

Ivica Mの回答の更新バージョン:

let wordDict = [
     "A" : [1, 2],
     "Z" : [3, 4],
     "D" : [5, 6]
]

let sortedDict = wordDict.sort { $0.0 < $1.0 }
print("\(sortedDict)") // 

スイフト3

wordDict.sorted(by: { $0.0 < $1.0 })

注意:

結果の配列が辞書ではないことに驚く人もいます。 辞書をソートできません!結果のデータ型は、@ Ivicaの答えのように、ソートされた配列です。

97
Dan Beaulieu

キーとキー値の両方をキーのソート順で繰り返したい場合、このフォームは非常に簡潔です

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)")
}
25
rks

Swift 4では、よりスマートに記述できます。

let d = [ 1 : "hello", 2 : "bye", -1 : "foo" ]
d = [Int : String](uniqueKeysWithValues: d.sorted{ $0.key < $1.key })
14
Davide Gianessi

上記のすべてを試してみました、要するに必要なのは

let sorted = dictionary.sorted { $0.key < $1.key }
let keysArraySorted = Array(sorted.map({ $0.key }))
let valuesArraySorted = Array(sorted.map({ $0.value }))
8
Elsammak

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"]
5
Arijan

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
}
5
Shiv Kumar

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]
3
AmyNguyen

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
1
Joeri

Swift 3はソートされます(by:<)

let dictionary = [
    "A" : [1, 2],
    "Z" : [3, 4],
    "D" : [5, 6]
]

let sortedKeys = Array(dictionary.keys).sorted(by:<) // ["A", "D", "Z"]
1
Shadros

これは、辞書自体をソートするためのエレガントな代替手段です。

Swift 4&5現在

let sortedKeys = myDict.keys.sorted()

for key in sortedKeys {
   // Ordered iteration over the dictionary
   let val = myDict[key]
}
0
ThunderStruct