1

次のようなキー (単語) と値 (スコア) を持つ辞書があるとします。

GOD    8
DONG   16
DOG    8
XI     21

最初にスコアで、次にアルファベット順にソートされる辞書キー (単語) の NSArray を作成したいと思います。上記の例から、これは次のようになります。

XI
DONG
DOG
GOD

これを達成するための最良の方法は何ですか?

4

3 に答える 3

1

NSDictionariesのNSArrayを使用し、NSSortDescriptorsを使用して実装します。

NSSortDescriptor *sdScore = [NSSortDescriptor alloc] initWithKey:@"SCORE" ascending:NO];
NSSortDescriptor *sdName = [NSSortDescriptor alloc] initWithKey:@"NAME" ascending:YES];
NSArray *sortedArrayOfDic = [unsortedArrayOfDic sortedArrayUsingDescriptors:[NSArray arrayWithObjects: sdScore, sdName, nil]];
于 2012-09-24T18:28:41.150 に答える
0

私は Mac を使用していないため、これをテストできませんでした (つづりが間違っていたら申し訳ありません)。

NSDictionary *dic1 = [NSDictionary dictionaryWithObjectsAndKeys:@"GOD", @"WORD", [NSNumber numberWithInt:8], @"SCORE", nil];
NSDictionary *dic2 = [NSDictionary dictionaryWithObjectsAndKeys:@"DONG", @"WORD", [NSNumber numberWithInt:16], @"SCORE", nil];
NSDictionary *dic3 = [NSDictionary dictionaryWithObjectsAndKeys:@"DOG", @"WORD", [NSNumber numberWithInt:8], @"SCORE", nil];
NSDictionary *dic4 = [NSDictionary dictionaryWithObjectsAndKeys:@"XI", @"WORD", [NSNumber numberWithInt:21], @"SCORE", nil];

NSSortDescriptor *scoreSort = [NSSortDescriptor sortDescriptorWithKey:@"SCORE" ascending:NO];
NSSortDescriptor *wordSort = [NSSortDescriptor sortDescriptorWithKey:@"WORD" ascending:YES];

NSArray *sortedArrayOfDic = [[NSArray arrayWithObjects:dic1, dic2, dic3, dic4, nil] sortedArrayUsingDescriptors:[NSArray arrayWithObjects:scoreSort, wordSort, nil]];

NSLog(@"%@", [sortedArrayOfDict valueForKeyPath:@"WORD"]);

これは同じことを行いますが、少し削減され、反復を回避します。

于 2012-09-24T20:47:13.730 に答える
0

カルロスの答えは正しいものです。誰かが興味を持っている場合に備えて、最終的に完成した完全なコードを投稿しているだけです。

NSDictionary *dataSourceDict = [NSDictionary dictionaryWithObjectsAndKeys:
                      [NSNumber numberWithInt:8], @"GOD",
                      [NSNumber numberWithInt:16], @"DONG",
                      [NSNumber numberWithInt:8], @"DOG",
                      [NSNumber numberWithInt:21], @"XI", nil];

NSSortDescriptor *scoreSort = [NSSortDescriptor sortDescriptorWithKey:@"SCORE" ascending:NO];
NSSortDescriptor *wordSort = [NSSortDescriptor sortDescriptorWithKey:@"WORD" ascending:YES];
NSArray *sorts = [NSArray arrayWithObjects:scoreSort, wordSort, nil];


NSMutableArray *unsortedArrayOfDict = [NSMutableArray array];

for (NSString *word in dataSourceDict)
{
    NSString *score = [dataSourceDict objectForKey:word];
    [unsortedArrayOfDict addObject: [NSDictionary dictionaryWithObjectsAndKeys:word, @"WORD", score, @"SCORE",  nil]];
}
NSArray *sortedArrayOfDict = [unsortedArrayOfDict sortedArrayUsingDescriptors:sorts];

NSDictionary *sortedDict = [sortedArrayOfDict valueForKeyPath:@"WORD"];

NSLog(@"%@", sortedDict);

関連: NSDictionary を 2 つの配列 (オブジェクトとキー) に分割し、両方をオブジェクト配列 (または同様のソリューション) で並べ替えます

于 2012-09-24T19:46:36.867 に答える