Obj-c - 如何将字符串的NSMutableArray转换为NSMutableDictionary,同时组合'like'键和汇总它们的对象值
我是自学成才的Objective-C,正在练习并尝试学习使用在线课程和堆栈溢出。但是我已经击中了僵局:Obj-c - 如何将字符串的NSMutableArray转换为NSMutableDictionary,同时组合'like'键和汇总它们的对象值
由用户输入提交(采摘一天提供的值)产生该阵列。我目前正在服用这些来自用户的默认值 - 提供的价值是动态的,这些都是例子:
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];
}
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
的价值观。似乎更本能。我做了一个他认为的类似的逻辑,它或多或少地是它的指令的具体执行。
谢谢!这已经奏效了,我的obj-c并没有你的优雅/简化,而且这些解释肯定有助于理解。希望我可以upvote,当我得到一些观点 – Michowl
你到目前为止的代码遍历您的阵列的两倍,将每个项目两次,丢弃部分(日期/键,数字/值)这不是有意在本次迭代,创建两个中间阵列。这些数组然后被组合成一个字典。
你的第一个简单的步骤是只有一次迭代,每个项目拆分成关键&值,并将其立即添加到字典中。这意味着每个项目只分割一次,不需要中间数组。
它还可以帮助您解决如何处理重复键你剩下的问题。如果你在字典中查找的关键,没有相应的值,则nil
返回,用这个你可以很容易地结合你的价值观。要生成字典,NSString
或NSDate
对象作为键和NSNumber
对象作为值:
- 拆分每个项成其两个部分
- 解析值(第二)部分为一个整数
- 可选地解析该键(第一)部分日期或保持它作为一个字符串
- 查找字典中的关键
- 如果键值不存在添加新的键/值对,包裹你的整数值为
NSNumber
objec t因此它可以存储在字典中 - 如果密钥确实存在,则将其匹配的
NSNumber
对象展开为一个整数,将新值添加到它,将总和作为新的NSNumber
对象并添加新的键/值配对到您的字典 - 这将取代字典中现有的键/值对。
HTH
05是不是一个整数你怎么会总结呢? – user3344236
我打算通过将其转换为[x intValue]来处理这个问题。我想我甚至可以领先我的自我,梳理像钥匙这样的对象,所以“13/09/2017”= 05,07,02; – Michowl
我会在一次迭代中将它直接添加到字典中。 –