如何禁用NSDictionary自动按键排序

时间:2012-10-04 12:21:12

标签: iphone ipad

当我在NSMutableDictionary中添加值时,它会自动设置Key。如何禁用它并按照第一组和第二组排列。

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

有没有办法按密钥禁用排序?

4 个答案:

答案 0 :(得分:4)

NSDictionary没有对你的键进行排序,字典中键的顺序未定义,因为它是一个无序的集合。

这意味着您在获取/打印元素时无法信任元素的顺序,除非您在获取元素时使用keysSortedByValueUsingSelector:keysSortedByValueUsingComparator:对它们进行排序。

您也可以在allKeys;

的手册中看到这一点
  

返回值
  包含字典键的新数组,如果是,则为空数组   字典没有条目。

     

讨论
  数组中元素的顺序是未定义。

无法在NSDictionary中按顺序保存键/值,因此如果您需要按照添加它们的顺序排序,则基本上有两个选项;

  • 将它们添加到有序集合中/从NSArray中删除 - 同时将它们添加到NSDictionary,然后使用 集合对于有序访问。
  • 在您添加到字典中的数据中添加一个字段,该字段会为每个添加进行计数,然后在从数组中获取所有密钥时使用keysSortedByValueUsingComparator:的字段对其进行排序。

答案 1 :(得分: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;

答案 2 :(得分:1)

NSDictionary无意排序。您可以通过使用allKeys获取所有密钥并根据自己的喜好对该数组进行排序来对其进行排序。然后循环遍历此数组并获取相应的值。

答案 3 :(得分:1)

NSDictionary中,您无法在插入时获取数据 如果要根据要插入的数据获取数据,可以使用数组