gpt4 book ai didi

ios - 根据 NSDictionary 键值将 NSArray 拆分为子数组

转载 作者:可可西里 更新时间:2023-11-01 05:41:46 25 4
gpt4 key购买 nike

我们有一个调用 SOAP 网络服务并检索一长串 XML 的应用程序,然后该应用程序将其解析为 NSDictionary 对象的 NSArrayNSArray 包含一个出租公寓信息列表,每个信息都存储在一个 NSDictionary 中。

整个列表可能包含 10 种不同类型的公寓(即 2 室、3 室),我们需要将 NSArray 拆分为更小的 NSArray在房间类型上,它在 NSDictionary 对象中有键“roomType”。

目前我们的算法是

  1. 使用[NSArray valueForKeyPath:@"@distinctUnionofObjects.room-type"]获取唯一房间类型值的列表。
  2. 遍历唯一房间类型值列表
  3. 对于每个唯一的房间类型值,使用 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 似乎遍历了每个键值的整个列表。是否有一种更有效的方法可以根据 NSDictionary 键将大型 NSArray 拆分为较小的 NSArray

最佳答案

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

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 拆分为子数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14335466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com