키를 기준으로 사전 정렬


128

Swift에서 사전을 정렬하고 싶습니다. 나는 같은 사전을 가지고있다 :

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

등 나는 그것을 좋아합니다

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

기타

나는 많은 솔루션을 시도했지만 아무도 나를 위해 일하지 않았다. XCode6 Beta 5를 사용하고 있으며 일부는 컴파일러 오류를 발생시키고 일부 솔루션은 예외를 제공합니다. 따라서 사전 정렬 작업 사본을 게시 할 수있는 사람입니다.



6
사전을 정렬 할 수 없으며 연관 컨테이너입니다. 특정 순서가 필요한 경우 키를 배열에 복사하고 정렬하십시오. 그런 다음 키를 반복하고 해당 값을 가져옵니다.
dasblinkenlight

@dasblinkenlight 그래서 배열을 신속하게 정렬하는 방법을 말해 줄 수 있습니까?
Aleem Ahmad

@AleemAhmad 이 답변을 살펴보십시오 sortedKeys. 기능 이 있습니다.
dasblinkenlight

@dasblinkenlight 나는 이것을 시도했지만 그것은 [에 KeyType가]에 오류를주고있다
Aleem 아마드

답변:


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 : 월간 변화하는 스위프트 구문은 현재 선호합니다.

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

전역 sorted은 더 이상 사용되지 않습니다.


이것은 키의 배열을 제공합니다. 배열에 값이 없습니다. 사전에서 값을 찾을 수 있습니다.
StilesCrisis

2
네 말이 맞아 방금 게시물을 편집하여 키별로 정렬 된 (키, 값) 쌍을 얻는 솔루션을 제공했습니다. 의견 주셔서 감사합니다.
Ivica M.

@IvicaM. 여보세요! 키로 사전을 정렬하는 방법을 이해했지만 사전에서 요소 배열을 정렬하는 방법을 이해하지 못합니다. 도와주세요. 예를 들어 개인 var 연락처 : [(String, [User])] = []
Alexander Khitev

5
스위프트 3 = 배열 ​​(사전 키) 정렬 (기준 : <)
miff

4
Swift 4부터 다음과 같이 작성할 수 있습니다.let sortedKeys = dictionary.keys.sorted()
Code Different

113

스위프트 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
이 실제로없는 사전을 [(문자열 [지능])]의 배열을 반환
scord

4
깨달은 사전은 분류되지 않으므로 어쨌든 데이터 유형을 다시 작성하는 것은 의미가 없습니다. 정렬 된 키 배열을 저장했습니다.
scord

내가 얻을 Binary operator > can not be compared to two Any` 피연산자. 다운 캐스팅도 작동하지 않습니다
Sean

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 스위프트 1 : sortsorted. 스위프트 2 : sort이되었다 sortInPlacesorted되고있다 sort.
Eric Aya

14

신속한 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)->>> 인쇄 [2 : "bye", -1 : " foo ", 1 :"hello "] d = [Int : String] (uniqueKeysWithValues ​​: d.sorted {$ 0.key <$ 1.key}) print (d)->>> 인쇄 [2 :"bye ", -1 : "foo", 1 : "hello"]
KarimIhab

그것은 사전으로 다시 변환 할 때 스위프트의 사전이 정렬되지 않은 컬렉션이므로 정렬되지 않은 컬렉션으로 변경됩니다
불가능합니다

12

간단히 말해서 위의 모든 것을 시도해 보았습니다.

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


6

스위프트 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 사전은 정의에 따라 정렬 할 수 없습니다. 튜플 배열이 최선입니다.
John Montgomery

1
나는 알고 있지만 질문은 주문을 요구 하므로이 대답은 정확하지 않습니다. 동의하십니까?
Daniel Arantes Loverde

6

이것은 사전 자체를 정렬하는 우아한 대안입니다.

스위프트 4 & 5 기준

let sortedKeys = myDict.keys.sorted()

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

6

에서 스위프트 5 순서대로 사전을 열쇠로 정렬하려면

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

값을 기준으로 사전을 정렬하려면

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
이것은 사전을 반환하지 않습니다. 이것은 Tuples의 배열을 반환합니다
anoop4real

답을 넣기 전에 질문을 읽지 마십시오. 많은 사람들의 시간을 낭비하고 있습니다. 이 질문은 구체적으로 사전을 정렬하고 정렬되지 않은 사전을 배열로 가져 오는 것에 관한 것입니다. 왜 모든 사람이 틀린 답을하고 있는지 모르겠습니다.
Shivam Pokhriyal

3

iOS 9 및 xcode 7.3에서 "정렬 됨", 신속한 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의 결과는 사전이 아니며 배열입니다!
Channel

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 (기준 : {$ 0.key <$ 1.key}) 자체 에서 사전 [값 : 값] 대신 튜플 (값, 값)을 반환합니다 . 따라서 for 루프는 튜플을 구문 분석하여 사전으로 반환합니다. 그렇게하면 사전에 넣고 사전을 다시 얻을 수 있습니다.


2

스위프트 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

스위프트 3이 정렬됩니다 (기준 : <)

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.