2012-06-26 15 views
7

में शब्दकोश मूल्य द्वारा एनएस डिक्शन कुंजी को सॉर्ट करें, मैंने चाबियों द्वारा एक शब्दकोश को सॉर्ट करने के कई उदाहरण देखे हैं, फिर मान प्राप्त कर रहे हैं, लेकिन मैं मूल्यों के बजाय क्रमबद्ध कैसे करूं।एनएसएआरएआर

उदा

{ 
blue:12; 
red:50; 
white:44; 
} 

मैं करने के लिए उतरते इन संख्या के अनुसार क्रमबद्ध चाहेगा:

{ 
red:50; 
white:44; 
blue:12 
} 

मैं कुंजी है जहाँ से मैं आदेश दिया NSArray बनाया सकता है, लेकिन परिणाम अभी भी अव्यवस्थित लगती है की एक क्रमबद्ध NSArray हो रही कोशिश की।

NSArray* sortedKeys = [stats keysSortedByValueUsingComparator:^(id first, id second) { 

    if (first < second) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } else if (first > second) { 
     return (NSComparisonResult)NSOrderedDescending; 
    } else { 
     return (NSComparisonResult)NSOrderedSame; 
    } 

    }]; 

उत्तर

9

संकल्पनात्मक रूप से एक NSDictionary को रद्द नहीं किया गया है, जैसा कि पहले से ही C0deH4cker द्वारा कहा गया है।

यदि आपको ऑर्डर की आवश्यकता है, तो आप या तो सरणी में चाबी लिख सकते हैं (लेकिन आपको कुंजीपटल से कुंजी हटा दिए जाने के बाद इसे बनाए रखने वाले सरणी के साथ परेशानी हो सकती है, लेकिन un-retaining array by using the CFArray बनाने के लिए ट्यूटोरियल हैं) NSSortedSet

या आप एनएस डिक्शनरी को उपclass कर सकते हैं - बहुत छोटा नहीं, क्योंकि NSDictionary एक क्लास क्लस्टर है। लेकिन सौभाग्य से मैट अपने शानदार ब्लॉगपोस्ट "OrderedDictionary: Subclassing a Cocoa class cluster" में एक छोटी सी चाल का उपयोग कैसे करें, एक कवर में संबंध है।


ध्यान दें, जो आपके कोड

NSArray* sortedKeys = [stats keysSortedByValueUsingComparator:^(id first, id second) { 

    if (first < second) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } else if (first > second) { 
     return (NSComparisonResult)NSOrderedDescending; 
    } else { 
     return (NSComparisonResult)NSOrderedSame; 
    } 

    }]; 

अभ्यस्त करते हैं, आप क्या चाहते हैं यह, ऐसा करने के लिए के रूप में आप वस्तुओं के लिए सी-ऑपरेटरों आवेदन कर रहे हैं। अब उनके पॉइंटर्स का आदेश दिया जाएगा।

NSArray* sortedKeys = [stats keysSortedByValueUsingComparator:^(id first, id second) { 
    return [first compare:second]; 
    }]; 

या सीधे आप scalars, कि वस्तुओं के रूप में रैपर हैं पर ऑर्डर करने के लिए (यानी NSNumber)

NSArray* sortedKeys = [stats keysSortedByValueUsingComparator:^(id first, id second) { 
    if ([first integerValue] > [second integerValue]) 
     return (NSComparisonResult)NSOrderedDescending; 

    if ([first integerValue] < [second integerValue]) 
     return (NSComparisonResult)NSOrderedAscending; 
    return (NSComparisonResult)NSOrderedSame; 
}]; 
0

परिभाषा के अनुसार शब्दकोश अनियंत्रित हैं। उन्हें गति के लिए हैश टेबल का उपयोग करके एक्सेस किया जाता है। एकमात्र तरीका है कि आप "ऑर्डर" करने में सक्षम होंगे, यह एक अलग डेटा प्रकार चुनना है। बस्ट डेटा प्रकार आपके इरादे पर निर्भर करता है।

+0

मैं डेटा को आउटपुट के रूप में ऑर्डर किए गए nsarray में बदलना चाहता हूं, लेकिन मैं साथ शुरू कर रहा हूं nsdictionary – MonkeyBonkey

0

चाहते हैं या आप कर सकते थे बस प्रकार अपने NSString कुंजी अगर तरह कुछ

यह होना चाहिए जैसे:

NSArray* sortedKeys = [sortedKeys sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { 
     NSNumber *A = @([obj1 LongValue]); 
     NSNumber *B = @([obj2 LongValue]); 

     return [A compare:B]; 
    } ]; 
संबंधित मुद्दे