2014-10-28 3 views
0

У меня есть NSDictionary со следующими данными:Заказать NSArray с объектами

(lldb) po allFriends 
{ 
    71685207018702188 =  { 
     id = 71685207018702188; 
     name = "mikeziri "; 
     username = mi; 
    }; 
    93374822540641772 =  { 
     id = 93374822540641772; 
     name = "Alan Weclipse"; 
     username = zuka; 
    }; 
    96553685978449395 =  { 
     id = 96553685978449395; 
     name = "Monica Weclipse"; 
     username = amonica; 
    }; 
    96556113096345076 =  { 
     id = 96556113096345076; 
     name = Xavier; 
     username = branko; 
    }; 
    97017008427632119 =  { 
     id = 97017008427632119; 
     name = "Dario Weclipse"; 
     username = tarzan; 
    }; 
} 

Я сортировки этих объектов на основе имени, если они не имеют имя, я будет использовать имя пользователя . Чтобы сделать это, я создать новый NSDictionary с именем и идентификатором и в конце метода я отсортировать их по имени . Код сортировать их заключается в следующем:

- (NSArray*)orderFriends 
{ 
    NSMutableDictionary* newFriendsDict = [[NSMutableDictionary alloc] init]; 

    for (int i=0; i<[allFriends count];i++) 
    { 
     NSMutableDictionary* friendsDict = [[NSMutableDictionary alloc] init]; 
     NSDictionary* friend = [allFriends objectForKey:[NSString stringWithFormat:@"%@", [sortedKeysFriends objectAtIndex:i]]]; 

     if ([[friend objectForKey:@"name"] length] != 0) 
     { 
      [friendsDict setObject:[friend objectForKey:@"id"] forKey:@"id"]; 
      [friendsDict setObject:[NSString stringWithFormat:@"%@", [friend objectForKey:@"name"]] forKey:@"name"]; 
     } 
     else 
     { 
      [friendsDict setObject:[friend objectForKey:@"id"] forKey:@"id"]; 
      [friendsDict setObject:[NSString stringWithFormat:@"%@", [friend objectForKey:@"username"]] forKey:@"name"]; 
     } 

     [newFriendsDict setObject:friendsDict forKey:[NSNumber numberWithInt:i]]; 
    } 

    NSArray* sp = nil; 
    sp = [[newFriendsDict allValues] sortedArrayUsingComparator:^(id obj1, id obj2){ 
     NSString *one = [NSString stringWithFormat:@"%@", [obj1 objectForKey:@"name"]]; 
     NSString *two = [NSString stringWithFormat:@"%@", [obj2 objectForKey:@"name"]]; 

     return [one compare:two]; 
    }]; 

    return sp; 
} 

Проблема заключается в том, что конечный результат не так:

(lldb) po sp 
<__NSArrayI 0x160491a0>(
{ 
    id = 93374822540641772; 
    name = "Alan Weclipse"; 
}, 
{ 
    id = 97017008427632119; 
    name = "Dario Weclipse"; 
}, 
{ 
    id = 96553685978449395; 
    name = "Monica Weclipse"; 
}, 
{ 
    id = 96556113096345076; 
    name = Xavier; 
}, 
{ 
    id = 71685207018702188; 
    name = "mikeziri "; 
}, 
) 
+0

Каждый раз, когда вы используете конструкцию 'stringWithFormat: @"% @ ", вы делаете ошибку. Это абсолютно ничего, кроме потери памяти и процессорного времени. Не делай этого. Просто используйте исходную строку, не используя stringWithFormat, который просто создает ненужный дубликат строки очень интенсивным образом. –

ответ

1

чувствителен к регистру. сделайте все строки маленькими или большими.

1

Вы также можете просто изменить
return [one compare:two];
в
return [one compare:two options: options:NSCaseInsensitiveSearch];

Чем будут упорядочены в алфавитном порядке, независимо от того, если верхний или нижний регистр ...

1

Несколько вещей: Там нет причин строить разные словари для того, чтобы сортировать, и веские причины НЕ делать это.

Вы уже нашли способ sortedArrayUsingComparator. Это берет блок, который используется для сравнения пар объектов и возвращает отсортированный массив. Вы можете использовать этот метод для реализации любых критериев сортировки, которые вы хотите.

Я бы предложил написать блок компаратора, который сравнивает свойства имени ваших объектов, если он не пуст, и использует имя пользователя, если оно пустое. Было бы только несколько строк кода:

NSArray *sortedFriends = [[allFriends allValues] sortedArrayUsingComparator: 
          ^(NSDictionary *obj1, NSDictionary *obj2) 
{ 
    NSString* key1 = obj1[@"name"] ? obj1[@"name"] : obj1[@"username"]; 
    NSString* key2 = obj2[@"name"] ? obj2[@"name"] : obj2[@"username"]; 
    return [key1 caseInsensitiveCompare: key2]; 
}]; 

EDIT: Я просто заметил (с вашего редактирования моего поста), что вы начинаете из словаря, а не массив. Итак, что вы хотите сделать, это создать отсортированный массив из всех значений в словаре? Допустимо ли отбрасывать ключи для всех элементов в вашем словаре и заканчивать сортированным массивом значений?

Другое, что вы могли бы сделать, это построить массив ключей словаря, отсортированный по вашим критериям сортировки. Затем вы можете использовать массив ключей для извлечения элементов из вашего словаря в отсортированном порядке.

Смежные вопросы