NSDictionary разделен на два массива (объекты и ключи), а затем отсортирован по массиву объектов (или аналогичному решению) - PullRequest
3 голосов
/ 24 сентября 2010

У меня есть NSDictionary.У него есть ключи и объекты.

Для простоты ключами являются номера Вопросов, и объекты рассчитываются. Оценки ответов.

Теперь, как я это делал раньше, я установил оценку ответов какключи и номера вопросов в качестве объектов.Таким образом, я мог бы получить массив allKeys из словаря, отсортировать его, а затем сделать что-то похожее на:

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

Проблема (глупая - с моей стороны), с которой я сейчас столкнулся, заключается в том, что (очевидно,... duuhhh) ключи должны быть уникальными, и поэтому, когда рассчитанные баллы ответов совпадают, выводится только один ответ!

Мне нужно решение этого вопроса.В PHP вы можете multisort массивов.Мне было интересно, было ли какое-то подобное решение в target-c или действительно, если бы у кого-то был лучший ответ?

Любая помощь здесь будет высоко ценится.

Спасибо.

Ответы [ 3 ]

8 голосов
/ 24 сентября 2010

Знаете ли вы о allKeys, allValues и allKeysForObject методе NSDictionary?

2 голосов
/ 24 сентября 2010

Одним из решений является сохранение оценок ответов с использованием массива словарей, содержащего только две пары ключ-значение.Одним из ключей является номер вопроса (или, тем не менее, ваши вопросы помечены, т. Е. «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];
}

Отказ от ответственности:

Непроверенный и не скомпилированный код.Только теория.

0 голосов
/ 24 сентября 2010

Я не уверен, чего вы на самом деле пытаетесь достичь. Вы хотите отсортировать массив объектов словаря на основе значения словаря? Если это то, что вы хотите, вы можете определить свою собственную функцию компаратора и определить любое пользовательское поведение сортировки. Пожалуйста, проверьте sortedArrayUsingSelector: метод NSArray.

Редактировать: В настоящее время я не в сети Mac, но этот предыдущий вопрос содержит несколько примеров кода, которые могут решить вашу проблему. Вместо того, чтобы использовать объект, вы можете использовать NSDictionary, хотя лично я хотел бы использовать другой объект Question вместо словаря в этом случае. Этот класс вопросов будет содержать два значения: идентификатор и оценку, а затем вам нужно будет отсортировать массив вопросов по баллам так же, как люди отсортированы по дням рождения.

...