2011-11-08 34 views
6


मैं एक साधारण एनएसएससेट चाहता हूं जो कुछ NSNumbers के साथ लोड हो और फिर पता लगाएं कि उन नंबरों को पहले से सेट में जोड़ा गया है या नहीं। जब मैं यह कर:NSNumbers के एनएसएससेट - सदस्य विधि हमेशा शून्य

NSMutableSet *set = [[NSMutableSet alloc] init]; 
NSNumber *num1 = [NSNumber numberWithInt:5]; 
NSNumber *num2 = [NSNumber numberWithInt:5]; 
[set addObject:num1]; 
if([set member:num2]){ 
    // something... 
} 

समस्या यह है कि सदस्य हमेशा शून्य रिटर्न (अगर गलत है), भले ही उन संख्याओं को एक ही कर रहे हैं। Isqual विधि सच हो जाता है। तो

if([num1 isEqual:num2]){ 
    // correct 
} 

काम करता है ...
डॉक्स में मैंने पढ़ा सदस्य विधि का उपयोग करता है isEqual इसलिए मैं नहीं जानता कि क्या समस्या है ... किसी भी सलाह के लिए धन्यवाद।

+0

यदि आपका कोड सही ढंग से चिपकाया गया है - आपने अपने सेट – Maggie

+0

पर ऑब्जेक्ट num2 नहीं जोड़ा है, तो आप निश्चित हैं .. आपका कोड मेरे लिए बिल्कुल ठीक काम कर रहा है! – Devarshi

+0

@ मैगी हाँ मुझे यकीन है कि बिंदु यह है कि मैं यह जांचना चाहता हूं कि नंबर 5 पहले से ही सेट में है या नहीं, लेकिन मुझे nsnumber का उपयोग करना है क्योंकि वे ऑब्जेक्ट्स हैं, इसलिए मैं जांचना चाहता हूं कि 5 के मान के साथ nsnumber ऑब्जेक्ट है या नहीं पहले से ही सेट में (मूल्य 5 के साथ num1 है, इसलिए इसे सच करना चाहिए) – haluzak

उत्तर

2

समस्या यह है कि आप जांच कर रहे हैं कि num1 और num2 एक ही ऑब्जेक्ट हैं। और वे नहीं हैं। उनके पास एक ही मूल्य है लेकिन वे एक ही मूल्य के साथ दो अलग-अलग वस्तुएं हैं।

तो आप member के साथ क्या जांच रहे हैं यह है कि उनके पास स्मृति में एक ही पता है या नहीं।

संपादित करें: आपको संख्याओं के मान समान हैं या नहीं, यह जांचने के लिए आपको compare का उपयोग करना चाहिए!

+0

"क्या उनके पास एक ही पता है स्मृति में "असत्य है; 'सदस्य: 'दस्तावेज़ों के अनुसार:" यदि सेट में ऑब्जेक्ट के बराबर ऑब्जेक्ट होता है (जैसा कि isEqual द्वारा निर्धारित किया गया है) तो वह ऑब्जेक्ट (आमतौर पर यह ऑब्जेक्ट होगा), अन्यथा शून्य। " – Wevah

+0

आप दोनों सही हो सकते हैं ...मुझे याद है कि एनएस नम्बर में एक स्नीकी ऑप्टिमाइज़ेशन है जहां इसमें पहले कुछ पूर्णांक के स्थिर प्रतिनिधित्व हैं। इस मामले में स्मृति पता _and_ isEqual काम करेगा। – jrturton

+0

निश्चित रूप से, लेकिन इसे किसी भी तरह से झूठी वापसी नहीं करनी चाहिए। – Wevah

4

एनएसएन बोर्स के मूल्यों की तुलना करना आवश्यक है, न कि ऑब्जेक्ट्स।

NSMutableSet *set = [[NSMutableSet alloc] init]; 
NSNumber *num1 = [NSNumber numberWithInt:5]; 
NSNumber *num2 = [NSNumber numberWithInt:5]; 
NSNumber *num3 = [NSNumber numberWithInt:3]; 
[set addObject:num1]; 

NSSet *filteredSet; 
filteredSet = [set objectsPassingTest:^(id obj,BOOL *stop){ 
    return [obj isEqualToNumber:num2]; 
}]; 
NSLog(@"Contains num2: %@", (filteredSet.count == 1) ? @"YES" : @"NO"); 

filteredSet = [set objectsPassingTest:^(id obj,BOOL *stop){ 
    return [obj isEqualToNumber:num3]; 
}]; 
NSLog(@"Contains num3: %@", (filteredSet.count == 1) ? @"YES" : @"NO"); 

NSLog उत्पादन:

Contains num2: YES 
Contains num3: NO 

या अगर विधेय का उपयोग कर वांछित है:

filteredSet = [set filteredSetUsingPredicate:[NSPredicate predicateWithFormat:@"SELF == %@", num2]]; 
NSLog(@"Contains num2: %@", (filteredSet.count == 1) ? @"YES" : @"NO"); 

filteredSet = [set filteredSetUsingPredicate:[NSPredicate predicateWithFormat:@"SELF == %@", num3]]; 
NSLog(@"Contains num3: %@", (filteredSet.count == 1) ? @"YES" : @"NO"); 
2

कॉड

आप objectsPassingTest:

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

NSMutableSet *set = [[NSMutableSet alloc] init]; 
NSNumber *num1 = [NSNumber numberWithInt:5]; 
NSNumber *num2 = [NSNumber numberWithInt:5]; 
[set addObject:num1]; 
if([set member:num2]){ 
    NSLog(@"Hello, world"); 
    } 
+0

यह मान्य नहीं है क्योंकि मैंने इसे सेट में जोड़ने के बाद * num1 से 6 के मान को बदल दिया है और फिर पूछें [सेट सदस्य num1] और [set सदस्य num2] दोनों सत्य वापस आते हैं। –

+0

@RyanHeitner, आप NSNumber-object कैसे बदल सकते हैं? वे अपरिवर्तनीय हैं! – ragnarius

+0

NSNumber * num1 = [NSNumber numberWithInt: 5]; [सेट addObject: num1]; num1 = [NSNumber संख्या WithInt: 6]; –

4

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

//during init, add some numbers 
NSMutableIndexSet *tSet = [[NSMutableIndexSet alloc] init]; 
NSUInteger exampleValue = 7; 
[tSet addIndex:exampleValue]; 
exampleValue = 42; 
[tSet addIndex:exampleValue]; 

//...later on 
//look to see if numbers are there 
if ([tSet containsIndex:7]){ 
    NSLog(@"7 exists!"); 
} 
if ([tSet containsIndex:8]){ 
    NSLog(@"8 exists!"); 
} 

आउटपुट: 7 मौजूद है!