NSDictionary拆分为两个数组(对象和键),然后由对象数组(或类似的解决方案)进行排序

时间:2010-09-24 09:30:59

标签: iphone objective-c nsarray nsdictionary

我有一个NSDictionary。它有钥匙和物品。

为简单起见,键是问号,对象是计算答案分数。

现在,我之前是如何做到的,因为我将答案分数设置为键,将问题编号设置为对象。通过这种方式,我可以从字典中获取allKeys的数组,对其进行排序,然后执行类似的操作:

for(NSString *string in tempArray){
  NSLog(@"%@",[dictionary objectForKey:string]);
}

我现在遇到的(愚蠢的 - 我)问题是(显然...... duuhhh)键需要唯一,因此当计算的答案分数相同时,只输出一个答案!

我需要一个解决方案。在PHP中,您可以multisort个数组。我想知道在objective-c中是否有类似的解决方案,或者确实有人有更好的答案?

非常感谢任何帮助。

谢谢。

3 个答案:

答案 0 :(得分:8)

您知道NSDictionary的allKeysallValuesallKeysForObject方法吗?

答案 1 :(得分:2)

一种解决方案是使用仅包含两个键值对的字典数组来存储答案分数。一个关键是问题编号(或者您的问题被标记,即“Q1.1”),而另一个关键是实际的答案分数。例如:

static NSString * const QuestionKey = @"questionNumber";
static NSString * const AnswerScoreKey = @"answerScore";

NSMutableArray *allAnswers = [NSMutableArray array];

for (int i = 0; i < 20; i++)
{
    // fill allAnswers array with random data
    NSDictionary *answer = [NSDictionary dictionaryWithObjectsForKeys:
        [NSString stringWithFormat:@"Q%d", i], QuestionKey,
        [NSNumber numberWithInt:rand()], AnswerScoreKey,
         nil];

    [allAnswers addObject:answer];
}

// sort the allAnswers array based on score, highest first
NSSortDescriptor *sortDesc = [NSSortDescriptor sortDescriptorWithKey:AnswerScoreKey ascending:NO];

[allAnswers sortUsingDescriptors:[NSArray arrayWithObject:sortDesc]];

for (NSDictionary *answer in allAnswers)
{
    NSLog(@"Question: %@, AnswerScore: %@", [answer objectForKey:QuestionKey], [answer objectForKey:AnswerScoreKey];
}

声明:

未经测试和未编译的代码。仅限理论。

答案 2 :(得分:0)

我不确定你到底想要实现的目标。是否要根据字典的值对字典对象数组进行排序?如果这是您想要的,您可以定义自己的比较器功能,并可以定义任何自定义排序行为。请检查sortedArrayUsingSelector:NSArray的方法。

编辑:我目前不在Mac上,但this previous question有许多示例代码可以解决您的问题。您可以使用NSDictionary,而不是使用对象,但在这种情况下我个人想要使用另一个Question对象而不是字典。这个问题类将包含两个值,id和score,然后你需要根据得分对问题数组进行排序,就像根据生日那样对人进行排序一样。