2017-09-20 48 views
0

我是自学成才的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]; 
     } 
+0

05是不是一个整数你怎么会总结呢? – user3344236

+0

我打算通过将其转换为[x intValue]来处理这个问题。我想我甚至可以领先我的自我,梳理像钥匙这样的对象,所以“13/09/2017”= 05,07,02; – Michowl

+0

我会在一次迭代中将它直接添加到字典中。 –

回答

0
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的价值观。似乎更本能。我做了一个他认为的类似的逻辑,它或多或少地是它的指令的具体执行。

+0

谢谢!这已经奏效了,我的obj-c并没有你的优雅/简化,而且这些解释肯定有助于理解。希望我可以upvote,当我得到一些观点 – Michowl

1

你到目前为止的代码遍历您的阵列的两倍,将每个项目两次,丢弃部分(日期/键,数字/值)这不是有意在本次迭代,创建两个中间阵列。这些数组然后被组合成一个字典。

你的第一个简单的步骤是只有一次迭代,每个项目拆分成关键&值,并将其立即添加到字典中。这意味着每个项目只分割一次,不需要中间数组。

它还可以帮助您解决如何处理重复键你剩下的问题。如果你在字典中查找的关键,没有相应的值,则nil返回,用这个你可以很容易地结合你的价值观。要生成字典,NSStringNSDate对象作为键和NSNumber对象作为值:

  1. 拆分每个项成其两个部分
  2. 解析值(第二)部分为一个整数
  3. 可选地解析该键(第一)部分日期或保持它作为一个字符串
  4. 查找字典中的关键
  5. 如果键值不存在添加新的键/值对,包裹你的整数值为NSNumber objec t因此它可以存储在字典中
  6. 如果密钥确实存在,则将其匹配的NSNumber对象展开为一个整数,将新值添加到它,将总和作为新的NSNumber对象并添加新的键/值配对到您的字典 - 这将取代字典中现有的键/值对。

HTH

相关问题