我需要重新安排下面的词典数组:
(
{
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;
}
任何帮助表示赞赏。 提前谢谢。
答案 0 :(得分:0)
我必须承认我对你的代码感到有些困惑,这是一种不寻常的排序尝试,只引用了密钥group_id
但是样本输入/输出表明了group_id
的双键排序作为主键,name
作为辅助键。
当然,虽然排序可能仍然是CS 201,但是现在您不需要自己实现排序算法,因为几乎每个标准库都提供了一个实现。 Cocoa也不例外,NSArray
具有适合您需要的sortedArrayUsingComparator:
方法 - 它使用您提供的函数对任何的数组进行排序,它比较了两个元素数组并根据您所需的排序返回它们的顺序。
该函数必须返回NSComparisonResult
的值,这是一个包含三个值NSOrderedAscending
,NSOrderedSame
和NSOrderedDescending
的值类型。 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
值,而NSString
在compare
系列中有许多方法。对于您的主键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;
}