Obj-c - 如何将字符串的 NSMutableArray 转换为 NSMutableDictionary,同时组合 'like' 键并对它们的对象值求和
Obj-c - How to convert NSMutableArray of strings into NSMutableDictionary while combining 'like' Keys and summing their Object values
我是自学成才的 objective-c,练习并尝试使用在线课程和堆栈溢出来学习。但是我陷入了僵局:
此数组由用户输入提交生成(选择一天并提供一个值)。我目前从用户默认值中获取这些值 - 提供的值是动态的,这些是示例:
NSMutableArray * arrayData;
arrayData = (NSMutableArray *) [[defaults objectForKey:@"uploadInputs"]mutableCopy];
// Here is an example of arrayData
arrayData = "10/09/2017,05","12/09/2017,24","13/09/2017,05","13/09/2017,07","13/09/2017,02"
我想把它变成一个以日期作为对象的键和值的字典。当有一个类似的键时,我想对对象中的值求和。所以期望的输出是:
{
"10/09/2017" = 05;
"12/09/2017" = 24;
"13/09/2017" = 14;
}
然而我目前得到的是:
{
"10/09/2017" = (
05
);
"12/09/2017" = (
24
);
"13/09/2017" = (
05,
07,
02
);
}
我做了什么:
NSMutableDictionary *dictTest3 = [[NSMutableDictionary alloc] init];
for (NSString *item in arrayData) {
NSString *key = [[item componentsSeparatedByString:@","] firstObject];
if(!dictTest3[key]){
dictTest3[key] = [NSMutableArray new];
}
[dictTest3[key] addObject:[[item componentsSeparatedByString:@","] lastObject]];
}
NSLog(@"dictTest3: %@ ",dictTest3);
我尝试遵循 CRD 提供的一些步骤并简化了代码——我现在正在努力的是总结为具有相同的创建的 NSMutableArray键。
我可以在字典中定位 NSMutableArray 吗?
是这样的东西吗?
NSMutableArray *fuBar = ;
NSInteger sum = 0;
for (NSNumber *num in fuBar)
{
sum += [num intValue];
}
到目前为止,您的代码在您的数组上迭代了两次,将每个项目拆分了两次,并丢弃了它在这次迭代中不感兴趣的部分 (date/key、number/value),创建了两个中间数组.然后将这些数组组合成一个字典。
您的第一个简单步骤是只迭代一次,将每个项目拆分为键和值,然后立即将它们添加到字典中。这意味着每个项目只拆分一次,不需要中间数组。
它还可以帮助您解决剩余的如何处理重复键的问题。如果您在字典中查找一个键并且没有对应的值,则返回 nil
,使用它您可以轻松地组合您的值。要使用 NSString
或 NSDate
对象作为键并使用 NSNumber
对象作为值来生成字典:
- 将每个项目分成两部分
- 将值(第二)部分解析为整数
- 可选择将关键(第一)部分解析为日期或将其保留为字符串
- 在字典中查找关键字
- 如果键值不存在,请添加新的 key/value 对,将整数值包装为
NSNumber
对象,以便将其存储在字典中
- 如果密钥确实存在,则获取其匹配的
NSNumber
对象,展开为整数,将新值添加到其中,将总和包装为新的 NSNumber
对象并添加新的 key/value 配对到您的字典 - 这将替换字典中现有的 key/value 对。
HTH
NSArray *arrayData = @[@"10/09/2017,05",
@"12/09/2017,24",
@"13/09/2017,05",
@"13/09/2017,07",
@"13/09/2017,02"];
NSMutableDictionary *finalDict = [[NSMutableDictionary alloc] init];
for (NSString *aString in arrayData)
{
NSArray *components = [aString componentsSeparatedByString:@","];
NSString *key = components[0]; //That's the date String
NSNumber *number; //Number to set as value in the finalDict
//We check before hand if there is already an entry
number = [finalDict objectForKey:key];
//Small trick: If there was no entry, then number is nil, and [number integerValue] gives 0 so after the execution number will be equals to components[1] converted into a NSNumber object. If not, it's simply added
number = @([number integerValue] + [components[1] integerValue]);
[finalDict setObject:number forKey:key];
}
NSLog(@"finalDict: %@", finalDict);
输出:
$> finalDict: {
"10/09/2017" = 5;
"12/09/2017" = 24;
"13/09/2017" = 14;
}
请注意,作为@CRD,我也想到了 NSNumber
而不是 NSString
作为值。似乎更本能。
我做了一个和他想的差不多的逻辑,或多或少是它指令的具体执行。
我是自学成才的 objective-c,练习并尝试使用在线课程和堆栈溢出来学习。但是我陷入了僵局:
此数组由用户输入提交生成(选择一天并提供一个值)。我目前从用户默认值中获取这些值 - 提供的值是动态的,这些是示例:
NSMutableArray * arrayData;
arrayData = (NSMutableArray *) [[defaults objectForKey:@"uploadInputs"]mutableCopy];
// Here is an example of arrayData
arrayData = "10/09/2017,05","12/09/2017,24","13/09/2017,05","13/09/2017,07","13/09/2017,02"
我想把它变成一个以日期作为对象的键和值的字典。当有一个类似的键时,我想对对象中的值求和。所以期望的输出是:
{
"10/09/2017" = 05;
"12/09/2017" = 24;
"13/09/2017" = 14;
}
然而我目前得到的是:
{
"10/09/2017" = (
05
);
"12/09/2017" = (
24
);
"13/09/2017" = (
05,
07,
02
);
}
我做了什么:
NSMutableDictionary *dictTest3 = [[NSMutableDictionary alloc] init];
for (NSString *item in arrayData) {
NSString *key = [[item componentsSeparatedByString:@","] firstObject];
if(!dictTest3[key]){
dictTest3[key] = [NSMutableArray new];
}
[dictTest3[key] addObject:[[item componentsSeparatedByString:@","] lastObject]];
}
NSLog(@"dictTest3: %@ ",dictTest3);
我尝试遵循 CRD 提供的一些步骤并简化了代码——我现在正在努力的是总结为具有相同的创建的 NSMutableArray键。
我可以在字典中定位 NSMutableArray 吗? 是这样的东西吗?
NSMutableArray *fuBar = ;
NSInteger sum = 0;
for (NSNumber *num in fuBar)
{
sum += [num intValue];
}
到目前为止,您的代码在您的数组上迭代了两次,将每个项目拆分了两次,并丢弃了它在这次迭代中不感兴趣的部分 (date/key、number/value),创建了两个中间数组.然后将这些数组组合成一个字典。
您的第一个简单步骤是只迭代一次,将每个项目拆分为键和值,然后立即将它们添加到字典中。这意味着每个项目只拆分一次,不需要中间数组。
它还可以帮助您解决剩余的如何处理重复键的问题。如果您在字典中查找一个键并且没有对应的值,则返回 nil
,使用它您可以轻松地组合您的值。要使用 NSString
或 NSDate
对象作为键并使用 NSNumber
对象作为值来生成字典:
- 将每个项目分成两部分
- 将值(第二)部分解析为整数
- 可选择将关键(第一)部分解析为日期或将其保留为字符串
- 在字典中查找关键字
- 如果键值不存在,请添加新的 key/value 对,将整数值包装为
NSNumber
对象,以便将其存储在字典中 - 如果密钥确实存在,则获取其匹配的
NSNumber
对象,展开为整数,将新值添加到其中,将总和包装为新的NSNumber
对象并添加新的 key/value 配对到您的字典 - 这将替换字典中现有的 key/value 对。
HTH
NSArray *arrayData = @[@"10/09/2017,05",
@"12/09/2017,24",
@"13/09/2017,05",
@"13/09/2017,07",
@"13/09/2017,02"];
NSMutableDictionary *finalDict = [[NSMutableDictionary alloc] init];
for (NSString *aString in arrayData)
{
NSArray *components = [aString componentsSeparatedByString:@","];
NSString *key = components[0]; //That's the date String
NSNumber *number; //Number to set as value in the finalDict
//We check before hand if there is already an entry
number = [finalDict objectForKey:key];
//Small trick: If there was no entry, then number is nil, and [number integerValue] gives 0 so after the execution number will be equals to components[1] converted into a NSNumber object. If not, it's simply added
number = @([number integerValue] + [components[1] integerValue]);
[finalDict setObject:number forKey:key];
}
NSLog(@"finalDict: %@", finalDict);
输出:
$> finalDict: {
"10/09/2017" = 5;
"12/09/2017" = 24;
"13/09/2017" = 14;
}
请注意,作为@CRD,我也想到了 NSNumber
而不是 NSString
作为值。似乎更本能。
我做了一个和他想的差不多的逻辑,或多或少是它指令的具体执行。