2012-10-04 25 views
10

當我在NSMutableDictionary添加值時,它自動設置密鑰明智。我怎樣才能禁用它,並按照第一組第一和第二組排列第二。如何禁用NSDictionary排序自動鍵明智

NSMutableDictionary* filteredDictionary = [NSMutableDictionary dictionary]; 

[filteredDictionary setObject:@"abc" forKey:@"1"]; 
[filteredDictionary setObject:@"abc" forKey:@"3"]; 
[filteredDictionary setObject:@"abc" forKey:@"2"]; 
[filteredDictionary setObject:@"abc" forKey:@"5"]; 
[filteredDictionary setObject:@"abc" forKey:@"4"]; 

NSLog(@"%@",filteredDictionary); 

current output: 
{ 
1 = abc; 
2 = abc; 
3 = abc; 
4 = abc; 
5 = abc;  
} 

but i want 
{ 
1 = abc; 
3 = abc; 
2 = abc; 
5 = abc;  
4 = abc; 
} 

有什麼辦法可以禁用按鍵排序嗎?

+1

我知道這是Dictionary的真正問題。但我可以用替代方法來幫助你。此外,訪問這些值時會發生很小的變化。另外,我不明白您面臨的問題是什麼,畢竟您只需通過KeyValue訪問它們。 –

+0

@amitrajput是這就是要點 –

+0

它只輸出描述字符串時排序鍵,它不會改變基於散列表的內存佈局。如果您通過它枚舉,它將不會被排序,因爲它旨在讓您快速訪問。 –

回答

2

下面是做這件事的方式:

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"key" ascending:YES comparator:^(id obj1, id obj2) { 

    if (obj1 > obj2) { 
     return (NSComparisonResult)NSOrderedDescending; 
    } 
    if (obj1 < obj2) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } 
    return (NSComparisonResult)NSOrderedSame; 
}]; 

NSArray *sortedKeys = [[filteredDictionary allKeys] sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

NSMutableDictionary *orderedDictionary = [NSMutableDictionary dictionary]; 

for (NSString *index in sortedKeys) { 
    [orderedDictionary setObject:[filteredDictionary objectForKey:index] forKey:index]; 
} 

filteredDictionary = orderedDictionary; 
+0

此代碼無法編譯,因爲[NSMutableDictionary]中沒有可用的'addObject'方法(https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSMutableDictionary_Class/Reference/Reference。 HTML),想知道它如何爲OP工作。 –

+0

哇,我一定是在破解時寫的......我會修好的!感謝您的發現。 –

1

NSDictionary並不意味着排序。您可以通過使用allKeys獲取所有密鑰並按照您的喜好對數組進行排序來對其進行排序。然後遍歷這個數組並獲取相應的值。

+0

但如果你知道請告訴我。 –

+0

查看Joachim和Simon的帖子。 – Rengers

4

NSDictionary不排序您的密鑰,字典中的密鑰的順序是未定義,因爲它是一個無序的集合。

這意味着當您取回/打印元素時,您不能相信元素的順序,除非您使用keysSortedByValueUsingSelector:keysSortedByValueUsingComparator:對它們進行排序,同時對它們進行排序。

你也可以在allKeys手冊中看到這個;

返回值
含有字典的鍵,或者一個空數組如果 字典裏沒有條目的新陣列。

討論
數組中元素的順序是沒有定義。

沒有辦法保持有序的鍵/值,你在想NSDictionary,所以如果你需要他們作爲他們添加了相同的順序排序,你基本上有兩種選擇;

  • 它們添加到/刪除它們從一個有序集合 - 比如NSArray - 在同一時間,因爲你將它們添加到NSDictionary,並使用該收集所訂購的訪問。
  • 將字段添加到要添加到字典中的數據中,每增加一個數字,然後將該字段與keysSortedByValueUsingComparator:一起使用,以便在從數組中提取所有鍵時對其進行排序。
1

NSDictionary爲你插入你不會得到這些數據。
如果你想根據你插入的數據獲取數據,你可以使用數組,