2011-08-07 12 views
6

私は多くの文字列を持っています。 辞書に並べ替えるのではなく、同じ文字を始めるすべての文字列が1つの配列に入り、配列がキーの値になります。キーは、その中のすべての単語が値の配列で始まる文字になります。配列を辞書に並べ替えます。

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

UTF-8入力と英語以外の言語でも、dictには26個以上の配列がある可能性が高いことに注意してください。このコードはまだ動作しますが、英語以外の単語を並べ替える場合は複雑な細部があります。 – bbum

+0

もちろん、私たちは世界の他の地域でも26文字以上あります。 ;)私は本当になぜこれが問題になるかは分かりません。問題は、これらを整理する方法ではなく( 'localizedCompare:' btwで簡単ですが)、最初の文字でグループ化する方法でした。ちょうど26の配列で終わるという要件については何の質問もありません。 – omz

+0

右 - それで私はあなたに快活さを与えたのです。ちょうどÄ、A、およびÅがすべて別のバケットで終わることを指摘していますが、それは重要であるかもしれないし、そうでないかもしれません(もちろん、巨弦声、汽車鴉叭聲、кряскам、भौंपudまたは、κραυια、καριόχηνας、κορνάρ?)。 – bbum

0

彼らはあなたとほぼ同じ問題を解決し、このトピックを見てみましょう - filtering NSArray into a new NSArray in objective-cそれはので、私はあなたの1つの以上のコードサンプルのために書きます解決しない場合は、私に教えてください。

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

これはUTF-8では機能しません。そのループでの予測の使用は、omzのソリューションに比べて遅くなるでしょう。 – bbum

1

あなたは以下の手順で欲しいものを達成することができます:

  1. は空が、可変辞書を作成します。
  2. 最初の文字を取得します。
  3. その文字のキーが存在しない場合は作成します。
  4. キーの値に単語を追加します(NSMutableArrayである必要があります)。
  5. すべてのキーについて手順2を繰り返します。

ここに、これらの手順のObjective-Cコードがあります。キーの大文字小文字をにしたいと仮定しています。

// 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);