2011-08-07 18 views
6

मेरे पास कई तार हैं और सरणी है। मैं उन्हें एक शब्दकोश में सॉर्ट नहीं करना चाहता, इसलिए एक ही अक्षर शुरू करने वाले सभी तार एक सरणी में जाते हैं और फिर सरणी कुंजी के लिए मान बन जाती है; कुंजी वह पत्र होगा जिसके साथ इसके मूल्य के सरणी में सभी शब्द शुरू हो जाएंगे।शब्दकोश में सरणी क्रमबद्ध करें

उदाहरण

Key = "A" >> Value = "array = apple, animal, alphabet, abc ..." 
Key = "B" >> Value = "array = bat, ball, banana ..." 

मैं ऐसा कैसे कर सकते हैं? अग्रिम धन्यवाद!

उत्तर

15
NSArray *list = [NSArray arrayWithObjects:@"apple, animal, bat, ball", nil]; 
NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
for (NSString *word in list) { 
    NSString *firstLetter = [[word substringToIndex:1] uppercaseString]; 
    NSMutableArray *letterList = [dict objectForKey:firstLetter]; 
    if (!letterList) { 
     letterList = [NSMutableArray array]; 
     [dict setObject:letterList forKey:firstLetter]; 
    } 
    [letterList addObject:word]; 
} 
NSLog(@"%@", dict); 
+1

ध्यान दें कि यूटीएफ -8 इनपुट और गैर-अंग्रेजी भाषाओं के मुकाबले आप 'dict' में 26 से अधिक सरणी के साथ काफी संभावनाएं समाप्त कर सकते हैं। यह कोड अभी भी काम करेगा, लेकिन जब गैर-अंग्रेजी शब्दों को सॉर्ट करने की बात आती है तो जटिल विवरणों की पूरी तरह से जानकारी होती है। – bbum

+0

निश्चित रूप से, हमारे पास दुनिया के अन्य हिस्सों में 26 से अधिक पत्र हैं। ;) मैं वास्तव में नहीं देखता कि यह एक समस्या क्यों होगी। सवाल यह नहीं था कि इन्हें कैसे क्रमबद्ध करें ('localizedCompare:' btw) के साथ आसान, लेकिन पहले अक्षर द्वारा उन्हें कैसे समूहित किया जाए। बिल्कुल 26 सरणी के साथ समाप्त होने की आवश्यकता के बारे में सवाल में कुछ भी नहीं है। – omz

+0

दाएं - यही कारण है कि मैंने आपको उत्साहित किया। बस यह इंगित करते हुए कि ए, और Å अलग-अलग बाल्टी में समाप्त होने जा रहे हैं जो कि इससे कोई फर्क नहीं पड़ता है (और, ज़ाहिर है, 鵝 叫聲, 汽車 喇叭 聲, кряскам, भौंपू जैसे सामानों के लिए अपरकेस स्ट्रिंग मैपिंग क्या है बजाना, 按喇叭, לִצפּוֹר, या κραυγή αγριόχηνας, κορνάρ?)। – bbum

0

इस विषय पर एक नजर डालें, तो वे आप के रूप में लगभग एक ही समस्या का हल - filtering NSArray into a new NSArray in objective-c यदि वह ऐसा मदद नहीं करता है मैं लिखूंगा मुझे जानते हैं के लिए आप एक और कोड नमूना। इस वर्णमाला के क्रम में सरणी की सामग्री को सॉर्ट करने के लिए

0

का प्रयोग करें, आगे आप आवश्यकता के डिजाइन

[keywordListArr sortUsingSelector: @selector (localizedCaseInsensitiveCompare :)];

-1

मैंने अभी यह नमूना लिखा है। यह सरल दिखता है और आपको जो चाहिए वह करता है।

NSArray *names = [NSArray arrayWithObjects:@"Anna", @"Antony", @"Jack", @"John", @"Nikita", @"Mark", @"Matthew", nil]; 

NSString *alphabet = @"ABCDEFGHIJKLMNOPQRSTUWXYZ"; 
NSMutableDictionary *sortedNames = [NSMutableDictionary dictionary]; 

for(int characterIndex = 0; characterIndex < 25; characterIndex++) { 
    NSString *alphabetCharacter = [alphabet substringWithRange:NSMakeRange(characterIndex, 1)]; 
    NSArray *filteredNames = [names filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF BEGINSWITH[C] %@", alphabetCharacter]];   
    [sortedNames setObject:filteredNames forKey:alphabetCharacter]; 
} 

//Just for testing purposes let's take a look into our sorted data 
for(NSString *key in sortedNames) { 
    for(NSString *value in [sortedNames valueForKey:key]) { 
     NSLog(@"%@:%@", key, value); 
    } 
} 
+0

यह यूटीएफ -8 के साथ काम नहीं करेगा और उस लूप में भविष्यवाणी का उपयोग ओमज़ के समाधान की तुलना में uber-धीमी होने वाला है। – bbum

1

आप प्राप्त कर सकते हैं क्या आप निम्न चरणों में हैं:

  1. एक खाली लेकिन परिवर्तनशील शब्दकोश बनाएँ।
  2. पहला अक्षर प्राप्त करें।
  3. यदि उस चरित्र के लिए कोई कुंजी मौजूद नहीं है, तो इसे बनाएं।
  4. कुंजी के मूल्य में शब्द जोड़ें (एक एनएसएमयूटेबलएरे होना चाहिए)।
  5. सभी चाबियों के लिए चरण # 2 दोहराएं।

इन चरणों के लिए उद्देश्य-सी कोड यहां दिया गया है। ध्यान दें कि मुझे लगता है कि आप चाबियाँ असंवेदनशील चाहते हैं।

// create our dummy dataset 
NSArray * wordArray = [NSArray arrayWithObjects:@"Apple", 
         @"Pickle", @"Monkey", @"Taco", 
         @"arsenal", @"punch", @"twitch", 
         @"mushy", nil]; 
// setup a dictionary 
NSMutableDictionary * wordDictionary = [[NSMutableDictionary alloc] init]; 
for (NSString * word in wordArray) { 
    // remove uppercaseString if you wish to keys case sensitive. 
    NSString * letter = [[word substringWithRange:NSMakeRange(0, 1)] uppercaseString]; 
    NSMutableArray * array = [wordDictionary objectForKey:letter]; 
    if (!array) { 
     // the key doesn't exist, so we will create it. 
     [wordDictionary setObject:(array = [NSMutableArray array]) forKey:letter]; 
    } 
    [array addObject:word]; 
} 
NSLog(@"Word dictionary: %@", wordDictionary); 
संबंधित मुद्दे