【问题标题】:Sorting NSMutableDictionary of ints in iOS [closed]在iOS中对整数的NSMutableDictionary进行排序[关闭]
【发布时间】:2013-04-02 17:39:20
【问题描述】:

我只是想知道是否可以在 iOS 中对整数字典进行排序? 查看前面的示例/问题,似乎大多数人都在对整数数组或字典数组(包含整数)进行排序。

但是,假设我有一本结构如下的字典:

 {numWords = 12, numPhotos = 15, numFriends = 8}

键不一样,所以似乎我不能使用排序描述符(用键初始化),那么有什么方法可以对整数进行排序并保持相关键的完整性?

【问题讨论】:

标签: ios objective-c sorting integer nsmutabledictionary


【解决方案1】:

字典无法排序。但是有一种方法会根据被排序的值按顺序返回一个键数组。

NSMutableDictionary *dict = ...; // your dictionary
NSArray *orderedKeys = [dict keysSortedByValueUsingSelector:@selector(compare:)];

在您的情况下,orderedKeys 将是 numFriends, numWords, numPhotos

要使用有序键,您可以执行以下操作:

for (id key in orderedKeys) {
    id value = [dict objectForKey:key];
}

【讨论】:

  • 但是使用这个解决方案,返回的数组没有从每个整数到每个字符串的指针(在这个例子中,这使得数组无用或至少令人困惑)
  • @Da49 您可以将两个数组并行排序 - 请参阅我的答案。
  • @Da49 然后你可以遍历有序的键,得到对应的值。查看我的更新。
【解决方案2】:

NSDictionary 没有排序。而且你永远不会对字典进行排序。

您确实对键和或值进行了排序。

对于您的情况:

你需要将所有的值提取到arrayValues中,并在arraykeys中并行keys,根据arrayValues排序。

NSMutableArray *array1 = [NSMutableArray arrayWithObjects:[NSNumber numberWithInt:5], [NSNumber numberWithInt:3], [NSNumber numberWithInt:1], [NSNumber numberWithInt:2], [NSNumber numberWithInt:4], [NSNumber numberWithInt:6], nil];
NSMutableArray *arrayKeys = @[@"Five", @"Three", @"One", @"Two", @"Four", @"Six"];
NSMutableArray *arrayValues = @[@"Cinq", @"Trois", @"Un", @"Deux", @"Quatre", @"Six"];
 [array1 sortArrayUsingSelector:@selector(compare:) withPairedMutableArrays:arrayKeys, arrayValues, nil];

在调用 sortArrayUsingSelector:withPairedArrays: 之后,三个数组都将按数字顺序排列,因此 arrayKeys 将如下所示:

One, Two, Three, Four, Five, Six

arrayValues 将如下所示:

Un, Deux, Trois, Quatre, Cinq, Six

【讨论】:

    【解决方案3】:

    假设对象是唯一的:

    1) 向字典查询 allValues

    数组

    2) 对值数组进行排序

    3) 由于没有valueForKey,对于每个值,使用快速枚举或enumerateKeysAndObjectsUsingBlock:来找到合适的key。

    【讨论】:

      【解决方案4】:

      字典不可排序。

      也就是说,您可以有两个排序数组,一个包含键,另一个包含关联的值。按值的顺序对它们进行排序。

      NSDictionary *d = @{
          @"numWords": @12,
          @"numPhotos": @15,
          @"numFriends": @8
      };
      
      NSComparisonResult (^cmp)(id, id) = ^(id obj1, id obj2) {
          return [obj1 compare:obj2];
      }
      
      NSArray *keys = [d keysSortedByValueUsingComparator:cmp]
      NSMutableArray *vals = [[id allValues] mutableCopy];
      [vals sortUsingComparator:cmp];
      

      【讨论】:

        猜你喜欢
        • 2016-03-01
        • 2011-06-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-04
        • 2015-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多