Sắp xếp từ điển theo phím


128

Tôi muốn sắp xếp một từ điển trong Swift. Tôi có một từ điển như:

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

vv Tôi muốn nó giống như

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

Vân vân.

Tôi đã thử nhiều giải pháp về SO nhưng không ai làm việc cho tôi. Tôi đang sử dụng XCode6 Beta 5 và trên đó một số lỗi trình biên dịch và một số giải pháp đang đưa ra ngoại lệ. Vì vậy, bất cứ ai có thể đăng các bản sao làm việc của sắp xếp từ điển.



6
Bạn không thể sắp xếp một từ điển, nó là một thùng chứa kết hợp. Nếu bạn cần một thứ tự cụ thể, sao chép các khóa vào một mảng và sắp xếp chúng. Sau đó lặp lại các phím và kéo các giá trị tương ứng của chúng.
dasblinkenlight

@dasblinkenlight Vậy bạn có thể cho tôi biết làm thế nào để sắp xếp một mảng trong swift không?
Aleem Ahmad

@AleemAhmad Hãy xem câu trả lời này , nó có sortedKeyschức năng.
dasblinkenlight

@dasblinkenlight Tôi đã thử cách này nhưng nó đang báo lỗi trên [KeyType]
Aleem Ahmad

Câu trả lời:


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

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

BIÊN TẬP:

Mảng được sắp xếp từ mã trên chỉ chứa các khóa, trong khi các giá trị phải được lấy từ từ điển gốc. Tuy nhiên, 'Dictionary'cũng là một 'CollectionType'cặp (khóa, giá trị) và chúng ta có thể sử dụng 'sorted'hàm toàn cục để có được một mảng được sắp xếp bao gồm cả khóa và giá trị, như sau:

let sortedKeysAndValues = sorted(dictionary) { $0.0 < $1.0 }
println(sortedKeysAndValues) // [(A, [1, 2]), (D, [5, 6]), (Z, [3, 4])]

EDIT2: Cú pháp Swift thay đổi hàng tháng hiện đang thích

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

Toàn cầu sortedbị phản đối.


Điều này cung cấp cho bạn một loạt các phím. Các mảng thiếu các giá trị. Bạn có thể tra cứu các giá trị từ từ điển, tôi đoán vậy.
StilesCrisis

2
Bạn đúng rồi. Tôi vừa chỉnh sửa bài đăng để cung cấp giải pháp để nhận một loạt các cặp (khóa, giá trị) được sắp xếp theo các khóa. Cảm ơn các bình luận.
Ivica M.

@IvicaM. Xin chào! Tôi hiểu làm thế nào tôi có thể sắp xếp từ điển theo các khóa, nhưng tôi không hiểu làm thế nào tôi có thể sắp xếp các phần tử trong từ điển. Làm ơn giúp tôi. Ví dụ: các liên hệ var riêng tư: [(Chuỗi, [Người dùng])] = []
Alexander Khitev

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

4
Kể từ Swift 4, bạn có thể viếtlet sortedKeys = dictionary.keys.sorted()
Mã khác

113

Swift 2.0

Phiên bản cập nhật của câu trả lời của Ivica M:

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

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

Swift 3

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

Để ý:

Đừng ngạc nhiên khi loại kết quả là một mảng chứ không phải là một từ điển. Từ điển không thể được sắp xếp ! Kiểu dữ liệu kết quả là một mảng được sắp xếp, giống như trong câu trả lời của @ Ivica.


26
cái này thực sự trả về một mảng [(String, [Int])] không phải là Dictionary
scord

4
Từ điển nhận ra là không được sắp xếp, vì vậy dù sao nó cũng không có ý nghĩa gì để tạo lại kiểu dữ liệu. Tôi cuối cùng chỉ lưu một mảng các phím được sắp xếp.
scord

Tôi nhận được Binary operator > can not be compared to two toán hạng Any`. Downcasting cũng không hoạt động
Sean

27

Nếu bạn muốn lặp lại cả khóa và giá trị theo thứ tự được sắp xếp khóa, biểu mẫu này khá ngắn gọn

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

Sắp xếp là phương thức tùy chỉnh hay gì? nó đang hiển thị lỗi trong khi thực hiện
rikky 10/03/2016

@rikkyG Swift 1: sortsorted. Swift 2: sortđã trở thành sortInPlacesortedđã trở thành sort.
Eric Aya

14

Trong swift 4 bạn có thể viết nó thông minh hơn:

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

3
Cảm ơn vì nỗ lực nhưng trước hết, "let" không tạo mã, vì vậy trước tiên nó cần phải là "var". Sau đó, sau khi biên dịch thành công mã này không hoạt động, nó không sắp xếp từ điển Tôi nhận được kết quả tương tự trước và sau khi chạy mã này. Có thể tôi đang thiếu một cái gì đó nhưng xin vui lòng giải thích thêm hoặc thay đổi mã. ======= var d = [1: "xin chào", 2: "tạm biệt", -1: "foo"] in (d) - >>> in [2: "bye", -1: " foo ", 1:" xin chào "] d = [Int: String] (uniqueKeysWithValues: d.sort {$ 0.key <$ 1.key}) print (d) - >>> print [2:" bye ", -1 : "foo", 1: "xin chào"]
KarimIhab

Không thể vì khi bạn chuyển đổi nó trở lại từ điển, nó sẽ thay đổi thành bộ sưu tập không có thứ tự vì từ điển trong swift là bộ sưu tập không có thứ tự developer.apple.com/documentation/swift/dipedia
Jaimin

12

Tôi đã thử tất cả những điều trên, tóm lại tất cả những gì bạn cần là

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


6

Đối với Swift 4, những điều sau đây đã giúp ích cho tôi:

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
Điều này không trả về một từ điển, điều này sẽ trả về một loạt các bộ dữ liệu
Daniel Arantes Loverde

Định nghĩa @DanielArantesLoverde là không thể định nghĩa theo định nghĩa. Một loạt các tuples là tốt nhất bạn có thể làm.
John Montgomery

1
Tôi biết điều đó, nhưng câu hỏi yêu cầu đặt hàng, vì vậy câu trả lời này không chính xác. Bạn có đồng ý không?
Daniel Arantes Loverde

6

Đây là một thay thế thanh lịch để tự sắp xếp từ điển:

Kể từ Swift 4 & 5

let sortedKeys = myDict.keys.sorted()

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

5

Trong Swift 5 , để sắp xếp Từ điển theo KEYS

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

Để sắp xếp từ điển theo GIÁ TRỊ

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

4

Đối với Swift 3, cách sắp xếp sau đây trả về từ điển được sắp xếp theo các khóa:

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
Điều này sẽ không trả lại một từ điển, điều này sẽ trả về một mảng
Tuples

Bạn thậm chí không đọc câu hỏi trước khi đặt câu trả lời của bạn. Bạn đang lãng phí thời gian của nhiều người ở đây. Câu hỏi này đặc biệt về việc sắp xếp một từ điển và nhận một từ điển được sắp xếp không phải là mảng. Tôi không biết tại sao mọi người lại trả lời sai.
Shivam Pokhriyal

3

"Sắp xếp" trong iOS 9 & xcode 7.3, swift 2.2 là không thể, thay đổi "được sắp xếp" thành "sắp xếp", như thế này:

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
Kết quả của sortKeysAndValues ​​không phải là một từ điển, đó là một mảng!
Kênh

2
Kết quả là một Arraysố Tuples, không phải là mộtDictionary

2

Swift 5

Nhập từ điển của bạn mà bạn muốn sắp xếp theo thứ tự abc theo các phím.

// 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.sort (bởi: {$ 0.key <$ 1.key}) bởi nó tự trả về một tuple (giá trị, giá trị) thay vì từ điển [value: value]. Do đó, vòng lặp for phân tích bộ dữ liệu để trả về dưới dạng từ điển. Bằng cách đó, bạn đặt một từ điển và lấy lại một từ điển.


2

Swift 4 & 5

Đối với sắp xếp khóa chuỗi:

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

Thí dụ:

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

Đối với Swift 3, phần sau đây đã hoạt động với tôi và cú pháp Swift 2 không hoạt động:

// 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

Câu trả lời này là không đầy đủ. Là sortedDictgì Là menugì Mã này dường như không hợp lệ.
Random_user_name

Một cái gì đó nghiêm trọng hơn bây giờ: một từ điển không có thứ tự . Những gì bạn nhận được với mã của mình là một loạt các bộ dữ liệu, không phải là một từ điển được sắp xếp - như đã nói trong một số câu trả lời và nhận xét.
Eric Aya

chủ đề là: sắp xếp từ điển theo các phím, tôi đang trả lời cho chủ đề này. Và đó là một nhận xét cụ thể chỉ liên quan đến thay đổi cú pháp trong Swift 3, nó không từ chối bất cứ điều gì từ những gì đã được viết trước đó.
Joeri

"Câu trả lời này khá chưa hoàn chỉnh. Sắp xếp là gì? Menu là gì? Mã này có vẻ không hợp lệ. - cale_b" Câu trả lời đã được chỉnh sửa, điều duy nhất còn thiếu là khai báo cho menu dictaty -. Tôi nghĩ rằng nó đã rõ ràng, đây chỉ là về một thay đổi cú pháp trong Swift 3 như được chỉ ra. Mã này hoạt động trong Swift 3.
Joeri

bất kỳ đề nghị cho swift 4 plz?
famfamfam

1

Swift 3 được sắp xếp (theo: <)

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

let sortedKeys = Array(dictionary.keys).sorted(by:<) // ["A", "D", "Z"]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.