キーで辞書を並べ替える


128

Swiftで辞書を並べ替えたいのですが。私は次のような辞書を持っています:

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

等になりたい

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

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



6
辞書をソートすることはできません。それは連想コンテナです。特定の順序が必要な場合は、キーを配列にコピーして並べ替えます。次に、キーを反復処理し、対応する値を引き出します。
dasblinkenlight 2014

@dasblinkenlightでは、配列を迅速にソートする方法を教えていただけますか?
Aleem Ahmad 2014

@AleemAhmad この回答を見てくださいsortedKeys。機能があります。
dasblinkenlight 2014

@dasblinkenlight私はこれを試しましたが、[KeyType]でエラーが発生します
Aleem Ahmad

回答:


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

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

編集:

上記のコードのソートされた配列にはキーのみが含まれていますが、値は元の辞書から取得する必要があります。ただし、'Dictionary''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は非推奨です。


これにより、キーの配列が得られます。配列には値がありません。辞書から値を調べることができると思います。
StilesCrisis 14

2
あなたが正しいです。キーでソートされた(キー、値)ペアの配列を取得するためのソリューションを提供するために、投稿を編集しました。コメントをありがとう。
Ivica M.

@IvicaM。こんにちは!キーで辞書を並べ替える方法は理解しましたが、辞書の要素の配列を並べ替える方法がわかりません。私を助けてください。たとえば、プライベート
変数の

5
Swift 3 = Array(dictionary.keys).sorted(by:<)
miff

4
Swift 4以降では、次のように記述できますlet sortedKeys = dictionary.keys.sorted()
Code Different

113

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の回答と同様に、ソートされた配列です。


26
これは実際には辞書ではなく[(String、[Int])]の配列を返します
scord

4
実現された辞書はソートされていないため、とにかくデータ型を再作成することはあまり意味がありません。ソートされたキーの配列を保存するだけになりました。
scord

Binary operator > can not be compared to two Any`オペランドを取得します。ダウンキャスティングも機能しません
ショーン

27

キーと値の両方をキーのソート順で反復処理する場合、このフォームは非常に簡潔です

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

ソートはカスタムメソッドまたは何ですか?実装中にエラーが表示される
rikky

@rikkyG Swift 1:sortおよびsorted。スウィフト2:sortとなっているsortInPlacesortedなっていますsort
Eric Aya

14

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

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

3
努力を感謝しますが、最初に、「let」はコードをビルドしないので、最初に「var」にする必要があります。その後、コンパイルが成功した後、このコードは機能しません。このコードを実行する前と後で同じ結果が得られる辞書をソートしません。何か足りないかもしれませんが、詳しく説明するか、コードを変更してください。======= var d = [1: "hello"、2: "bye"、-1: "foo"] print(d)->>> prints [2: "bye"、-1: " foo "、1:" hello "] d = [Int:String](uniqueKeysWithValues:d.sorted {$ 0.key <$ 1.key})print(d)->>> prints [2:" bye "、-1 : "foo"、1: "hello"]
KarimIhab

あなたは辞書に戻ってそれを変換する際に迅速で辞書があるとして、それは順不同コレクションに順序付けられていないコレクションの変更されますように、それは不可能ですdeveloper.apple.com/documentation/swift/dictionary
Jaimin

12

上記のすべてを試しましたが、簡単に言えば、必要なのは

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


6

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
これはディクショナリを返さず、タプルの配列を返します
Daniel Arantes Loverde

@DanielArantesLoverde辞書は、定義によりソートできません。タプルの配列は、あなたができる最高のものです。
ジョンモンゴメリー

1
私はそれを知っていますが、質問は注文を求めているので、この答えは正しくありません。同意しますか?
Daniel Arantes Loverde、2018年

6

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

Swift 4および5以降

let sortedKeys = myDict.keys.sorted()

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

6

ではスウィフト5 KEYSで辞書をソートするために、

let sortedYourArray = YOURDICTIONARY.sorted( by: { $0.0 < $1.0 })

辞書をVALUESでソートするには

let sortedYourArray = YOURDICTIONARY.sorted( by: { $0.1 < $1.1 })

4

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

10
これは辞書を返さず、タプルの配列を返します
anoop4real

答えを出す前に質問を読んでもいませんか。あなたはここで多くの人々の時間を無駄にしています。この質問は、特に辞書の並べ替えと、並べ替えられていない配列の辞書の取得についてです。なぜみんなが間違った答えをしているのか分かりません。
Shivam Pokhriyal 2018

3

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
SortedKeysAndValuesの結果は辞書ではなく、配列です。
チャネル

2
結果はのArrayTuplesはなくDictionary

2

スウィフト5

キーでアルファベット順に並べ替えたい辞書を入力します。

// Sort inputted dictionary with keys alphabetically.
func sortWithKeys(_ dict: [String: Any]) -> [String: Any] {
    let sorted = dict.sorted(by: { $0.key < $1.key })
    var newDict: [String: Any] = [:]
    for sortedDict in sorted {
        newDict[sortedDict.key] = sortedDict.value
    }
    return newDict
}

dict.sorted(by:{$ 0.key <$ 1.key})それ自体は、辞書 [値:値] ではなくタプル(値、値)を返します。したがって、forループはタプルを解析して辞書として返します。そうすれば、辞書を入れて辞書を取り戻すことができます。


2

Swift 4および5

文字列キーの並べ替えの場合:

dictionary.keys.sorted(by: {$0.localizedStandardCompare($1) == .orderedAscending})

例:

var dict : [String : Any] = ["10" : Any, "2" : Any, "20" : Any, "1" : Any]

dictionary.keys.sorted() 

["1" : Any, "10" : Any, "2" : Any, "20" : Any]

dictionary.keys.sorted(by: {$0.localizedStandardCompare($1) == .orderedAscending})

["1" : Any, "2" : Any, "10" : Any, "20" : Any]


1

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

この答えはかなり不完全です。なにsortedDict?なにmenu?このコードも有効ではないようです。
random_user_name

より深刻な問題:辞書に順序がない。コードで得られるのは、ソートされた辞書ではなく、タプルの配列です-いくつかの回答やコメントですでに述べられているように。
Eric Aya

トピックは次のとおりです。キーで辞書を並べ替えます。このトピックに答えています。また、Swift 3での構文の変更のみに関する特別な注意事項であり、以前に書かれた内容を否定するものではありません。
Joeri

「この回答はかなり不完全です。sortedDictとは何ですか?メニューとは何ですか?このコードも有効ではないようです。– cale_b」回答が編集されました。私はそれが明らかであると思った、これは示されているようにSwift 3の構文の変更についてのみです。コードはSwift 3で機能します
Joeri

迅速な4 plzの提案はありますか?
famfamfam

1

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

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

let sortedKeys = Array(dictionary.keys).sorted(by:<) // ["A", "D", "Z"]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.