2014-10-28 132 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; 
    }; 
} 

我整理基礎上,這些對象,如果他們沒有,我將使用用戶名。要做到這一點,我創建了一個新的的NSDictionaryID,並在方法結束時,我用排序。對它們進行排序的代碼如下:

- (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,它只是以一種處理器密集型的方式創建一個不需要的字符串副本。 – 2014-10-29 17:21:48

回答

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]; 
}]; 

編輯:我剛纔注意到(從我的文章的編輯)你是從字典,而不是一個數組開始。所以你想要做的是創建一個字典中所有值的排序數組?丟棄字典中所有項目的鍵是否可以接受,並最終得到一個有序值的數組?

你可以做的另一件事是建立一個字典鍵數組,根據你的排序標準排序。然後,您可以使用鍵數組按照排序順序從字典中提取項目。