शब्दकोश कुंजी के आधार पर छाँटें


128

मैं स्विफ्ट में एक शब्दकोश सॉर्ट करना चाहता हूं। मेरे पास एक शब्दकोश है:

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

मैं चाहता हूं कि यह ऐसा हो

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

आदि।

मैंने एसओ पर कई समाधान की कोशिश की है, लेकिन किसी ने मेरे लिए काम नहीं किया। मैं XCode6 बीटा 5 का उपयोग कर रहा हूं और इस पर कुछ संकलक त्रुटि दे रहे हैं और कुछ समाधान अपवाद दे रहे हैं। तो जो कोई भी शब्दकोश छँटाई की कामकाजी प्रति पोस्ट कर सकता है।



6
आप एक शब्दकोश सॉर्ट नहीं कर सकते, यह एक सहयोगी कंटेनर है। यदि आपको किसी विशेष ऑर्डर की आवश्यकता है, तो कुंजियों को एक सरणी में कॉपी करें, और उन्हें सॉर्ट करें। फिर कुंजियों पर पुनरावृति करें, और उनके संबंधित मानों को खींचें।
dasblinkenlight

@dasblinkenlight तो क्या आप मुझे बता सकते हैं कि एक सरणी को कैसे तेजी से क्रमबद्ध किया जाए?
अलीम अहमद

@AleemAhmad इस जवाब पर एक नज़र डालें , इसका sortedKeysकार्य है।
dasblinkenlight

@dasblinkenlight मैंने यह कोशिश की है लेकिन यह [KeyType] पर त्रुटि दे रहा है
अलीम अहमद

जवाबों:


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पदावनत है।


यह आपको चाबियों का एक सरणी देता है। सरणी में मानों की कमी है। मुझे लगता है कि आप शब्दकोश से मूल्यों को देख सकते हैं।
स्टाइल्सक्रिस

2
तुम सही हो। मैंने कुंजी द्वारा क्रमबद्ध (कुंजी, मान) जोड़े की एक सरणी प्राप्त करने के लिए एक समाधान प्रदान करने के लिए पोस्ट को संपादित किया है। टिप्पणी के लिए धन्यवाद।
Ivica M.

@IvicaM। हैलो! मैं समझ गया कि कैसे मैं कुंजी के द्वारा शब्दकोश को सॉर्ट कर सकता हूं, लेकिन मुझे समझ में नहीं आता है कि मैं शब्दकोश में तत्वों की श्रेणी कैसे बना सकता हूं। क्रिप्या मेरि सहायता करे। उदाहरण के लिए निजी संस्करण संपर्क: [(स्ट्रिंग, [उपयोगकर्ता])] = []
अलेक्जेंडर खितेव

5
स्विफ्ट 3 = एरियर (डिक्शनरी।आईकेएस) .sorted (द्वारा: <)
मिफ़

4
स्विफ्ट 4 के रूप में, आप लिख सकते हैंlet sortedKeys = dictionary.keys.sorted()
कोड डिफरेंट

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
यह वास्तव में एक सरणी देता है [(स्ट्रिंग, [इंट]) नहीं एक शब्दकोश
स्कोर्ड

4
एहसास हुआ डिस्क्राइब अनसोल्ड हैं, इसलिए डेटा टाइप को फिर से बनाने के लिए यह बहुत मायने नहीं रखता है। मैंने छँटनी कुंजी की एक सरणी को बचाने के लिए समाप्त कर दिया।
scord

मुझे Binary operator > can not be compared to two Any` ऑपरेंड्स मिलते हैं। डाउनकास्टिंग या तो काम नहीं करता है
सीन 23

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: sortऔर sorted। स्विफ्ट 2: sortबन गया है sortInPlaceऔर sortedबन गया है sort
एरिक आया

14

स्विफ्ट 4 में आप इसे स्मार्ट तरीके से लिख सकते हैं:

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

3
प्रयास के लिए धन्यवाद, लेकिन सबसे पहले, "चलो" कोड का निर्माण नहीं करता है, इसलिए पहले इसे "var" होना चाहिए। फिर संकलन सफल होने के बाद यह कोड काम नहीं करता है, इस कोड को चलाने से पहले और बाद में मुझे एक ही परिणाम मिलता है। हो सकता है कि मुझे कुछ याद आ रहा है, लेकिन कृपया अधिक विस्तृत करें या कोड बदलें। ======= var d = [1: "हैलो", 2: "अलविदा", -1: "फू"] प्रिंट (d) - >>> प्रिंट [2: "अलविदा", -1: " foo ", 1:" hello "] d = [Int: String] (uniqueKeysWithValues: d.sorted {$ 0.key <$ 1.key}) प्रिंट (d) - >>> प्रिंट्स [2: bye", -1 : "फू", 1: "हैलो"]
करीमहब

यह संभव नहीं है जब आप इसे वापस डिक्शनरी में बदलते हैं तो यह अनऑर्डर किए गए कलेक्शन में बदल जाएगा क्योंकि स्विफ्ट में डिक्शनरी अनऑर्डरेड कलेक्शन डेवलपर हैं
।apple.com

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
यह एक शब्दकोश वापस नहीं करता है, इस tuples की एक सरणी वापस आ जाएगी
डैनियल Arantes Loverde

@DanielArantesLoverde शब्दकोश परिभाषा से अटूट हैं। ट्यूपल्स की एक सरणी सबसे अच्छी है जो आप कर सकते हैं।
जॉन मोंटगोमरी

1
मुझे पता है कि, लेकिन सवाल एक आदेश के लिए पूछ रहा है, इसलिए यह उत्तर सही नहीं है। क्या आप सहमत हैं?
डैनियल एरेन्तेस लवरेड

6

यह शब्दकोश को छाँटने का एक सुंदर विकल्प है:

स्विफ्ट 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

स्विफ्ट 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 की एक सरणी लौटेगा
अनूप

क्या आप अपना जवाब डालने से पहले सवाल भी नहीं पढ़ते हैं। आप यहां कई लोगों का समय बर्बाद कर रहे हैं। यह प्रश्न विशेष रूप से एक शब्दकोश को छाँटने और एक क्रमबद्ध शब्दकोश नहीं सरणी के बारे में है। मुझे नहीं पता कि हर कोई गलत जवाब क्यों दे रहा है।
शिवम पोखरियाल

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 ​​का परिणाम शब्दकोश नहीं है, यह एक ऐरे है!
चैनल

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
}

: ({$ 0.key <$ 1.key} द्वारा) dict.sorted यह द्वारा स्वयं एक रिटर्न टपल (मूल्य, मूल्य) एक के बजाय शब्दकोश [मूल्य: मूल्य]। इस प्रकार, लूप के लिए एक शब्दकोष के रूप में लौटने के लिए टपल को पार्स करता है। इस तरह, आप एक शब्दकोश में डालते हैं और एक शब्दकोश वापस प्राप्त करते हैं।


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

स्विफ्ट 3 के लिए निम्नलिखित ने मेरे लिए काम किया है और स्विफ्ट 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

अब कुछ और गंभीर: एक शब्दकोश में कोई आदेश नहीं है । आपके कोड के साथ आपको जो मिलता है वह एक प्रकार का ट्यूल है, न कि छांटा गया शब्दकोश - जैसा कि पहले ही कुछ जवाबों और टिप्पणियों में कहा जा चुका है।
एरिक आया

विषय है: कुंजियों द्वारा क्रमबद्ध शब्दकोश, मैं इस विषय का जवाब दे रहा हूं। और यह स्विफ्ट 3 में केवल एक सिंटैक्स परिवर्तन के संबंध में एक विशिष्ट टिप्पणी है, जो पहले लिखा गया है, उससे कुछ भी इनकार नहीं करता है।
जोएरी

"यह उत्तर बहुत अधूरा है। क्या हल किया गया है? क्या मेनू है? यह कोड मान्य प्रतीत नहीं होता है, या तो। - cale_b" उत्तर संपादित किया गया था, केवल एक चीज गायब थी एक dictionaty - मेनू के लिए एक घोषणा थी। मुझे लगा कि यह स्पष्ट है, यह केवल स्विफ्ट 3 में एक सिंटैक्स परिवर्तन के बारे में है जैसा कि संकेत दिया गया है। कोड स्विफ्ट 3 में काम करता है
जोएरी

स्विफ्ट 4 plz के लिए कोई सुझाव?
अकालफाम

1

स्विफ्ट 3 क्रमबद्ध है (द्वारा: <)

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

let sortedKeys = Array(dictionary.keys).sorted(by:<) // ["A", "D", "Z"]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.