10

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

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

4 回答 4

4

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

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

您也可以在allKeys的手册中看到这一点;

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

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

没有办法让键/值按你想要的NSDictionary顺序排列,所以如果你需要它们按照添加的顺序排列,你基本上有两个选择;

  • NSArray在将它们添加到 ,的同时将它们添加到有序集合中/从有序集合中删除它们NSDictionary,并将集合用于有序访问。
  • 将一个字段添加到您要添加到字典中的数据中,每次添加都会计数,然后keysSortedByValueUsingComparator:在从数组中获取所有键时使用该字段对其进行排序。
于 2012-10-04T12:29:05.590 回答
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;
于 2012-10-04T12:36:03.803 回答
1

NSDictionary不是要排序的。您可以通过使用所有键allKeys并根据自己的喜好对该数组进行排序来对其进行排序。然后遍历这个数组,得到对应的值。

于 2012-10-04T12:26:38.507 回答
1

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

于 2012-10-04T13:14:42.270 回答