HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 根据NSDictionary键值将NSArray拆分为子数组大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我们有一个应用程序调用SOAP Web服务并检索 XML的长列表,然后应用程序将其解析为NSDray对象的NSArray. NSArray包含Rental Apartment信息列表,每个信息都存储在NSDictionary中.

整个列表可能@R_998_11262@0种不同类型的公寓(即2室,3室),我们需要将NSArray拆分为基于Room-Type的较小的NSArray,它在NSDictionary对象中具有关键的“roomType”.

目前我们的算法是

>使用[NSArray valueForKeyPath:@“@ disTinctUnionofObjects.room-type”]
获取唯一房间类型值的列表.
>循环显示唯一的房间类型值列表
>对于每个唯一的房间类型值,使用NSPreDicate从原始列表中检索匹配的项目

我们的代码如下(为清晰起见重命名):

NSArray *arrOriginal = ... ...; // Contains the Parsed XML list

NSMutableArray *marrApartmentsByRoomType = [NSMutableArray arrayWithCapacity:10];

NSMutableArray *arrRoomTypes = [arrOriginal valueForKeyPath:@"disTinctUnionOfObjects.roomType"];

for(NSString *strRoomType in arrRoomTypes) {
  NSPreDicate *preDicateRoomType = [NSPreDicate preDicateWithFormat:@"roomType=%@",strRoomType];

  NSArray *arrApartmentsThatMatchRoomType = [arrOriginal filteredArrayUsingPreDicate:preDicateRoomType];  // TAKES A LONG TIME EACH LOOP-ROUND

  [marrApartmentsByRoomType addObject:arrApartmentsThatMatchRoomType];
}

然而,步骤3花费很长时间,因为原始列表可能包含大量(> 100,000)的项目.似乎NSPreDicate遍历每个键值的整个列表.是否有更有效的方法将大型NSArray拆分为更小的NSArray,基于NSDictionary键?

解决方法

如果您的分割数组的顺序不重要,我有一个解决方案:

NSArray *arrOriginal;
NSMutableDictionary *grouped = [[NSMutableDictionary alloc] initWithCapacity:arrOriginal.count];
for (NSDictionary *Dict in arrOriginal) {
    id key = [Dict valueForKey:@"roomType"];

    NSMutableArray *tmp = [grouped objectForKey:key];
    if (tmp == nil) {
        tmp = [[NSMutableArray alloc] init];
        [grouped setObject:tmp forKey:key];
    }
    [tmp addObject:Dict];
}
NSMutableArray *marrApartmentsByRoomType = [grouped allValues];

大佬总结

以上是大佬教程为你收集整理的ios – 根据NSDictionary键值将NSArray拆分为子数组全部内容,希望文章能够帮你解决ios – 根据NSDictionary键值将NSArray拆分为子数组所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。