2009-10-25 19 views
17

मैं NSUserDefaults में सहेजने के लिए NSDictionary में मानों के रूप में नामों के रूप में कुंजी और स्कोर के रूप में स्टोर करता हूं। मैं फिर स्कोर द्वारा क्रमबद्ध चाबियाँ वापस प्राप्त करना चाहता हूं, लेकिन मैं केवल स्ट्रिंग द्वारा संख्यात्मक रूप से उन्हें सॉर्ट नहीं कर सकता। उदाहरण के लिए स्कोर 100, 50, 300, 200, 500 की सूची, मुझे 100, 200, 300, 50, 500 देता है।मूल्य संख्या द्वारा क्रमबद्ध NSDictionary कुंजी

क्या यह किया जा सकता है या मुझे इसके बारे में अलग-अलग जाने की आवश्यकता है?

NSString *defaultNames[] = {@"Matt", @"Terry",@"Jessica",@"Sean",nil}; 
NSNumber *defaultScores[] = {@"600", @"500",@"100",@"50", nil}; 

NSDictionary *newScoreDict = [NSDictionary dictionaryWithObjects:(id *)defaultScores forKeys:(id *)defaultNames count:7]; 

NSArray *currScores = [scoreDict keysSortedByValueUsingSelector:@selector(compare:)]; 
+3

तुम क्यों लगा रहे हैं तार? –

+0

यह एक उत्कृष्ट सवाल है ... हे, मुझे याद किया होगा कि – Matt

+1

आप क्यों कह रहे हैं कि वास्तव में 4 में एरे में 7 ऑब्जेक्ट्स हैं? इस बहुत उपयोगी प्रश्न के लिए –

उत्तर

2

-compare: एक स्ट्रिंग तुलना है। तुलना के लिए एक अलग विधि पास करें, उदाहरण:

@implementation NSString (numericComparison) 

- (NSComparisonResult) compareNumerically:(NSString *) other 
{ 
float myValue = [self floatValue]; 
float otherValue = [other floatValue]; 
if (myValue == otherValue) return NSOrderedSame; 
return (myValue < otherValue ? NSOrderedAscending : NSOrderedDescending); 
} 

@end 

अपने विशिष्ट मामले में, आप इसके बजाय -intValue का उपयोग कर सकते हैं।

+0

इस तरह के कोड लिखने की कोशिश कर रहा है लेकिन एनएसएसटींग में नहीं लेता है, बल्कि एक int में ले जाता है।[स्वयं floatValue] क्या करता है; इंगित? – prince

0

सुनिश्चित नहीं है कि इससे मदद मिलेगी, लेकिन आप एक प्लेस्ट में एनएसएआरएआर को भी बचा सकते हैं; एक NSDictionary (जो अनिवार्य रूप से यादृच्छिक क्रम में कुंजी देता है) के विपरीत, आप उन्हें वापस के रूप में आप उन्हें में डाल मिलता है।

7

कैसे keysSortedByValueUsingSelector (NSDictionary) का उपयोग कर के बारे में

क्या आप XCode में प्रलेखन के अनुसार जरूरत होने के लिए लगता है

+0

केवल 10.6+ – hmak

+2

@hmak के लिए उपलब्ध है: नहीं। आप 'चाबियों के बारे में सोच रहे होंगे' स्काईडब्लूव्यूयूउजिंगकंपेटर: 'पोस्ट का उल्लेख है' चाबियाँ स्टेटेड बायवैल्यूउजिंग चयनकर्ता: ', जो 10.0 – user102008

+1

के बाद से उपलब्ध है, क्या मुझे यह उल्लेख करना चाहिए कि आईओएस के लिए सवाल मैकोज़ नहीं है? –

3
@implementation NSString (numericComparison) 

- (NSComparisonResult) floatCompare:(NSString *) other 
{ 
    float myValue = [self floatValue]; 
    float otherValue = [other floatValue]; 
    if (myValue == otherValue) return NSOrderedSame; 
    return (myValue < otherValue ? NSOrderedAscending : NSOrderedDescending); 
} 

- (NSComparisonResult) intCompare:(NSString *) other 
{ 
    int myValue = [self intValue]; 
    int otherValue = [other intValue]; 
    if (myValue == otherValue) return NSOrderedSame; 
    return (myValue < otherValue ? NSOrderedAscending : NSOrderedDescending); 
} 

@end 

NSString *defaultNames[] = {@"Matt", @"Terry",@"Jessica",@"Sean",nil}; 
// NSNumber *defaultScores[] = {@"600", @"500",@"100",@"50", nil}; 

NSNumber *defaultScores[] = {                 
      [NSNumber numberWithInt:600], 
      [NSNumber numberWithInt:500], 
      [NSNumber numberWithInt:100], 
      [NSNumber numberWithInt:50], 
      nil 
    }; 

NSDictionary *newScoreDict = [NSDictionary dictionaryWithObjects:(id *)defaultScores forKeys:(id *)defaultNames count:4]; 

NSArray *currScores = [newScoreDict keysSortedByValueUsingSelector:@selector(intCompare:NotSureWhatGoesHere:)]; 

मैं अभी भी पिछली लाइन से उलझन में हूं?

मैं बस का उपयोग करते हैं

// 
NSArray *currScores = [newScoreDict keysSortedByValueUsingSelector:@selector(intCompare:other:)]; 
// 

ठीक संख्या की सरणी है, या वहाँ एक आसान तरीका है?

बहुत बहुत धन्यवाद ...

+0

आप डबल की बजाय फ्लोट का उपयोग क्यों कर रहे हैं? – gnasher729

5
NSString *defaultNames[] = {@"Matt", @"Terry",@"Jessica",@"Sean",nil}; 
NSNumber *defaultScores[] = {@"600", @"500",@"100",@"50", nil}; 
NSDictionary *newScoreDict = [NSDictionary dictionaryWithObjects:(id *)defaultScores forKeys:(id *)defaultNames count:7]; 
NSArray *currScores = [scoreDict keysSortedByValueUsingSelector:@selector(localizedStandardCompare:)]; 
+0

मैं यह काम नहीं कर सका क्योंकि मेरे मूल्य NSNumbers थे। लेकिन मैंने इस तुलनित्र का उपयोग किया और यह काम किया: https://stackoverflow.com/a/9708772/2057171 –

0

मुझे लगता है कि इस सवाल का सबसे आसान तरीका है तुलनित्र उपयोग कर रहा है ..

NSString *defaultNames[] = {@"Matt", @"Terry",@"Jessica",@"Sean",nil}; 
NSNumber *defaultScores[] = {@(600), @(500),@(400),@(50), nil}; 
NSDictionary *newScoreDict = [NSDictionary dictionaryWithObjects:defaultNames  forKeys:defaultScores count:4]; 
NSArray *currScores = [newScoreDict keysSortedByValueUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    if ([obj1 integerValue] > [obj2 integerValue]) { 
     return NSOrderedAscending; 
    }else{ 
     return NSOrderedDescending; 
    }}]; 

for (NSString *string in currScores) { 
    NSLog(@"%@",string); 
} 

इस कोशिश .. मैंने देखा है कि मैं के साथ पहुंच मूल्य सके NSNumber ऑब्जेक्ट का उपयोग करके यदि आप ऑब्जेक्ट वैल्यू तक पहुंचना चाहते हैं तो मैंने एनएसटीआरआरआर को अपने एनएसएनंबर स्कोर को बदलने के साथ हल किया है और ऑर्डर करते समय उन्हें संख्या में बदल दिया है। आप NSNumber संकेत के अपने सरणी में नीचे की तरह उपयोग कर सकते हैं ..

NSString *defaultNames[] = {@"Matt", @"Terry",@"Jessica",@"Sean",nil}; 
NSString *defaultScores[] = {@"600", @"500",@"400",@"50", nil}; 
NSMutableDictionary *newScoreDict = [NSMutableDictionary dictionaryWithObjects:defaultScores forKeys:defaultNames count:4]; 

NSArray *currScores = [newScoreDict keysSortedByValueUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
NSNumber *number1 = [formatter numberFromString:obj1]; 
NSNumber *number2 = [formatter numberFromString:obj2]; 
    if (number1.intValue > number2.intValue) { 
     return NSOrderedDescending; 
    }else{ 
     return NSOrderedAscending; 
    }}]; 

for (NSString *name in currScores) { 
    NSLog(@"key %@ value %@",name,[newScoreDict valueForKey:name]); 
} 

आशा है कि यह मदद करता है ..

संबंधित मुद्दे