根据组ID重新安排大量的词典

时间:2016-03-13 08:21:33

标签: ios objective-c

我需要重新安排下面的词典数组:

(
  {
   name : "aaa"
   group_id : 1.1
  },
  {
   name : "bbb"
   group_id : 1.2
  },
  {
   name : "ccc"
   group_id : 1.1
  },
  {
   name : "ddd"
   group_id : 1.2
  },
  {
   name : "aaa"
   group_id : 1.3
  },
  ...
)

对此:

(
  (
   {
    name : "aaa"
    group_id : 1.1
   },
   {
    name : "ccc"
    group_id : 1.1
   }
  ),
  (
   {
    name : "bbb"
    group_id : 1.2
   },
   {
    name : "ddd"
    group_id : 1.2
   }
  ),
  {
   name : "aaa"
   group_id : 1.3
  },
  ...
)

需要重新排列的字典数组的数量超过1500.需要尽快重新排列。

我正在使用它:

-(NSMutableArray *)filterForAnnotationsWithArray:(NSMutableArray *)originalArray{

    NSMutableArray *requiredArr = [NSMutableArray array];
    NSMutableArray *indexesArr = [NSMutableArray array];
    NSMutableArray *tempRemovingIndexesArr = [NSMutableArray array];
    NSMutableArray *filteringArr1 = [NSMutableArray arrayWithArray:[removeNullValues removeNullinData:originalArray]];

    for (int i=0; i<originalArray.count; i++) {
        [indexesArr removeAllObjects];
        for (NSDictionary *dict in filteringArr1) {
            if ([[dict valueForKey:@"group_id"] isEqualToString:[[originalArray objectAtIndex:i] valueForKey:@"group_id"]]) {
                if (![tempRemovingIndexesArr containsObject:[NSString stringWithFormat:@"%lu",(unsigned long)[filteringArr1 indexOfObject:dict]]]) {
                    [indexesArr addObject:[NSString stringWithFormat:@"%lu",(unsigned long)[filteringArr1 indexOfObject:dict]]];
                    [tempRemovingIndexesArr addObject:[NSString stringWithFormat:@"%lu",(unsigned long)[filteringArr1 indexOfObject:dict]]];
                }
            }
            if ([filteringArr1 indexOfObject:dict] == filteringArr1.count-1) {
                if (indexesArr.count>1) {
                    NSMutableArray *searchedArr = [NSMutableArray array];
                    for (NSString *str in indexesArr) {
                        [searchedArr addObject:[originalArray objectAtIndex:str.intValue]];
                    }
                    [requiredArr addObject:searchedArr];
                }
                else if(indexesArr.count == 1){
                    [requiredArr addObject:[originalArray objectAtIndex:[[indexesArr objectAtIndex:0] intValue]]];
                }
            }
        }
    }
    return requiredArr;
}

任何帮助表示赞赏。 提前谢谢。

2 个答案:

答案 0 :(得分:0)

我必须承认我对你的代码感到有些困惑,这是一种不寻常的排序尝试,只引用了密钥group_id但是样本输入/输出表明了group_id的双键排序作为主键,name作为辅助键。

当然,虽然排序可能仍然是CS 201,但是现在您不需要自己实现排序算法,因为几乎每个标准库都提供了一个实现。 Cocoa也不例外,NSArray具有适合您需要的sortedArrayUsingComparator:方法 - 它使用您提供的函数对任何的数组进行排序,它比较了两个元素数组并根据您所需的排序返回它们的顺序。

该函数必须返回NSComparisonResult的值,这是一个包含三个值NSOrderedAscendingNSOrderedSameNSOrderedDescending的值类型。 Cocoa还在compare系列中提供了一系列返回NSComparisonResult值的方法。

现在你想要一个2键排序。在任何n键排序中,您首先要比较第一个键的值,如果它们相等(NSOrderedSame),那么您将移动到下一个键并比较该键。只要键的值相等或者用完了键,就重复此操作。对于伪代码中的两个密钥,这是:

NSComparisonResult order = compare key1 of object1 and object2;
if (order is NSOrderedSame) order = compare key2 of object1 and object2;
return order;

这就是你如何比较每个键。两者都是NSString值,而NSStringcompare系列中有许多方法。对于您的主键group_id,字符串的数值是决定订单的因素,因此您需要一个考虑数值的compare系列方法 - 尝试compare:options:

结合上述内容,您应该在几行中得到答案。如果你尝试并陷入困境,请问另一个问题,显示你已经生成的代码,并解释你为何陷入困境。有人可能会帮忙。

HTH。

答案 1 :(得分:0)

我提出这个解决方案比我之前使用的更快。

-(NSMutableArray *)filterForAnnotationsWithArray:(NSMutableArray *)originalArray{
    NSMutableArray *tempRemovingIndexesArr = [NSMutableArray array];
    NSMutableArray *filteringArr1 = [NSMutableArray arrayWithArray:[removeNullValues removeNullinData:originalArray]];

    for (int i=0; i<originalArray.count; i++) {
        if (i!=0) {
            NSArray *filteredarray2 = [filteringArr1 filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(group_id != %@)", [[filteringArr1 objectAtIndex:0] valueForKey:@"group_id"]]];
            [filteringArr1 removeAllObjects];
            if (filteredarray2.count>0) {
                [filteringArr1 addObjectsFromArray:filteredarray2];
            }
        }
        if (filteringArr1.count>0) {
            NSArray *filteredarray = [filteringArr1 filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(group_id == %@)", [[filteringArr1 objectAtIndex:0] valueForKey:@"group_id"]]];
            if (filteredarray.count>0) {
                if (filteredarray.count == 1) {
                    [tempRemovingIndexesArr addObjectsFromArray:filteredarray];
                }
                else{
                    [tempRemovingIndexesArr addObject:filteredarray];
                }
            }
        }
        else{
            return tempRemovingIndexesArr;
        }
    return originalArray;
}