จัดเรียงพจนานุกรมตามคีย์


128

ฉันต้องการจัดเรียงพจนานุกรมใน Swift ฉันมีพจนานุกรมเช่น:

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

ฯลฯ อยากให้เป็นยังไง

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

เป็นต้น

ฉันได้ลองวิธีแก้ปัญหามากมายใน SO แต่ไม่มีใครได้ผลสำหรับฉัน ฉันใช้ XCode6 Beta 5 และมีบางส่วนให้ข้อผิดพลาดของคอมไพเลอร์และโซลูชันบางอย่างให้ข้อยกเว้น ดังนั้นทุกคนที่สามารถโพสต์สำเนาการจัดเรียงพจนานุกรมที่ใช้งานได้



6
คุณไม่สามารถจัดเรียงพจนานุกรมได้ แต่เป็นคอนเทนเนอร์ที่เชื่อมโยงกัน หากคุณต้องการคำสั่งซื้อเฉพาะให้คัดลอกคีย์ลงในอาร์เรย์แล้วเรียงลำดับ จากนั้นทำซ้ำบนคีย์และดึงค่าที่เกี่ยวข้อง
dasblinkenlight

@dasblinkenlight ช่วยบอกหน่อยได้ไหมว่าเรียงอาร์เรย์แบบรวดเร็วได้อย่างไร?
Aleem Ahmad

@AleemAhmad ลองดูคำตอบนี้มันมีsortedKeysฟังก์ชั่น
dasblinkenlight

@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])]

แก้ไข 2:ไวยากรณ์ Swift ที่เปลี่ยนแปลงรายเดือนเป็นที่ต้องการในปัจจุบัน

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

ทั่วโลกsortedเลิกใช้งานแล้ว


ซึ่งจะช่วยให้คุณมีคีย์มากมาย อาร์เรย์ขาดค่า คุณสามารถค้นหาค่าจากพจนานุกรมฉันเดา
StilesCrisis

2
คุณพูดถูก ฉันเพิ่งแก้ไขโพสต์เพื่อเป็นแนวทางในการรับอาร์เรย์ของคู่ (คีย์ค่า) ที่เรียงตามคีย์ ขอบคุณสำหรับความคิดเห็น
Ivica M.

@IvicaM สวัสดี! ฉันเข้าใจวิธีจัดเรียงพจนานุกรมตามคีย์ แต่ฉันไม่เข้าใจว่าจะจัดเรียงอาร์เรย์ขององค์ประกอบในพจนานุกรมได้อย่างไร โปรดช่วยฉันด้วย ตัวอย่างผู้ติดต่อ var ส่วนตัว: [(String, [User])] = []
Alexander Khitev

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])] ไม่ใช่ Dictionary
scord

4
พจนานุกรมที่ได้รับการยอมรับนั้นไม่มีการเรียงลำดับดังนั้นจึงไม่สมเหตุสมผลที่จะสร้างประเภทข้อมูลขึ้นมาใหม่ ฉันลงเอยด้วยการบันทึกคีย์ที่เรียงลำดับอาร์เรย์
scord

ฉันได้รับBinary operator > can not be compared to two ตัวถูกดำเนินการใด ๆ Downcasting ก็ใช้ไม่ได้เช่นกัน
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)")
}

sorted คือ Custom method หรือ What? มันแสดงข้อผิดพลาดขณะใช้งาน
rikky

@rikkyG Swift 1: sortและsorted. สวิฟท์ที่ 2: sortได้กลายเป็นsortInPlaceและได้กลายเป็นsorted 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"] พิมพ์ (d) - >>> พิมพ์ [2: "bye", -1: " foo ", 1:" hello "] d = [Int: String] (uniqueKeysWithValues: d.sorted {$ 0.key <$ 1.key}) พิมพ์ (d) - >>> พิมพ์ [2:" bye ", -1 : "foo", 1: "hello"]
KarimIhab

เป็นไปไม่ได้เนื่องจากเมื่อคุณแปลงกลับเป็นพจนานุกรมมันจะเปลี่ยนเป็นคอลเลกชันที่ไม่มีการเรียงลำดับเนื่องจากพจนานุกรมในรวดเร็วเป็นผู้พัฒนา
apple.com/documentation/swift/dictionary

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
สิ่งนี้ไม่ได้ส่งคืน Dictionary แต่จะส่งคืนอาร์เรย์ของสิ่งทอ
Daniel Arantes Loverde

@DanielArantesLoverde พจนานุกรมไม่สามารถแยกประเภทได้ตามความหมาย สิ่งที่ดีที่สุดที่คุณสามารถทำได้
John Montgomery

1
ฉันรู้ แต่คำถามขอคำสั่งดังนั้นคำตอบนี้ไม่ถูกต้อง คุณเห็นด้วยไหม?
Daniel Arantes Loverde

6

นี่เป็นทางเลือกที่สวยงามในการจัดเรียงพจนานุกรมเอง:

ของ Swift 4 & 5

let sortedKeys = myDict.keys.sorted()

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

6

ในSwift 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
สิ่งนี้จะไม่ส่งคืนพจนานุกรมซึ่งจะส่งคืนอาร์เรย์ของ Tuples
anoop4real

คุณไม่ได้อ่านคำถามก่อนที่จะตอบ คุณกำลังเสียเวลาของคนจำนวนมากที่นี่ คำถามนี้เกี่ยวกับการจัดเรียงพจนานุกรมและการจัดเรียงพจนานุกรมไม่ใช่อาร์เรย์ ฉันไม่รู้ว่าทำไมทุกคนถึงตอบผิด
Shivam Pokhriyal

3

"sorted" ใน iOS 9 & xcode 7.3, swift 2.2 เป็นไปไม่ได้, เปลี่ยน "sorted" เป็น "sort" ดังนี้:

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 ​​ไม่ใช่พจนานุกรม แต่เป็น Array!
ช่อง

2
ผลที่ได้คือArrayการTuplesไม่ได้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})โดยตัวเองจะส่งคืนทูเปิล (ค่า, ค่า) แทนพจนานุกรม [value: value] ดังนั้น for loop จะแยกวิเคราะห์ tuple เพื่อส่งคืนเป็นพจนานุกรม ด้วยวิธีนี้คุณใส่พจนานุกรมและรับพจนานุกรมคืน


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" คำตอบถูกแก้ไขสิ่งเดียวที่ขาดหายไปคือการประกาศสำหรับ dictionaty - เมนู ฉันคิดว่ามันชัดเจนนี่เป็นเพียงการเปลี่ยนแปลงทางไวยากรณ์ใน Swift 3 ตามที่ระบุไว้ รหัสทำงานใน Swift 3
Joeri

ข้อเสนอแนะใด ๆ สำหรับ swift 4 plz?
famfamfam

1

จัดเรียง Swift 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.