【问题标题】:Objective C: Create arrays from first array based on value目标 C:根据值从第一个数组创建数组
【发布时间】:2010-05-04 16:39:08
【问题描述】:

我有一个逗号分隔的字符串数组,例如:

Steve Jobs,12,CA
Fake Name,21,CA
Test Name,22,CA
Bill Gates,44,WA
Bill Nye,21,OR

我在 NSScanner 对象中有这些值,这样我就可以遍历这些值并使用 objectAtIndex 获取每个逗号分隔的值。

所以,我想做的是根据一个值(在本例中为 State)将数组项分组到新数组中。因此,我需要从中循环,检查它们处于哪个状态,然后将它们推送到一个新数组中,每个状态一个数组。

CA Array:
Steve Jobs,12,CA
Fake Name,21,CA
Test Name,22,CA

WA Array:
Bill Gates,44,WA

OR Array:
Bill Nye,21,OR

所以最后,我会有 3 个新数组,每个州一个。此外,如果在第一个数组中使用了其他状态,则这些状态也应该创建新数组。

任何帮助将不胜感激!

【问题讨论】:

    标签: iphone objective-c arrays string


    【解决方案1】:

    您可以使用NSMutableArrays 中的NSMutableDictionary - 如果遇到的状态不在字典中,请添加一个新数组。

    NSMutableArray* arr = [states objectForKey:state];
    if (arr == nil) {
        arr = [NSMutableArray array];
        [states setObject:arr forKey:state];
    }
    

    然后您可以将值插入到数组中,最好是作为对象,尽管正如 Dave DeLong 提到的那样。

    【讨论】:

    • 状态是什么类型的对象?
    • @Nic: 一个NSMutableDictionary,状态码是关键。
    • 好的,我创建了一个新类并将我的每个对象放入 NSMutableArary。这会让事情变得更容易吗?我所做的与您在此处发布的内容类似:stackoverflow.com/questions/2766994#2767037
    • @Nic:那是 Daves 的回答,不是我的。如果您在多个地方使用数据,使用 costum 对象会变得更加容易 - 您可以通过给定的名称访问它,而不是重复解析代码等。此外,重复解析相同的信息会降低性能。
    【解决方案2】:

    您不应将此数据保存为 CSV。如果您需要以编程方式操作这些数据(例如您正在尝试做的事情),那将是一个痛苦的世界。

    您可以使用NSArray * portions = [line componentsSeparatedByString:@","]; 天真地将这些数据分解为一个数组。然后创建一个自定义对象来存储每个部分(例如,参见this post),然后您几乎可以毫不费力地操作这些对象。

    【讨论】:

    • 戴夫,我正在使用 componentsSeparatedByString。
    • @Nic 很棒;现在遵循面向对象编程的原则,将这些数据封装在自己的对象中。
    【解决方案3】:

    天真地:(假设字符串数组称为字符串)

    NSMutableDictionary *states = [NSMutableDictionary dictionary];
    for (NSString *string in strings) {
      NSString *state = [[string componentsSeparatedByString:@", "] lastObject];  
      NSMutableArray *values = [states objectForKey:state];
      if (values == nil) {
         values = [NSMutableArray array];
         [states setObject:value forKey:state];
      }
      [values addObject:string];
    }
    

    关于此的一些事情 - 首先,我不在我的电脑前,所以很可能会出现拼写错误和/或我错过的事情。其次,您可能希望调整由字符串行分隔的组件以更好地处理空格。

    【讨论】:

    • 使用 101 按钮或缩进 4 个空格进行代码标记。不过,其中大部分看起来与上面的某个答案惊人地相似;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 2020-02-11
    • 2012-06-25
    • 2018-09-08
    • 2018-07-02
    • 2021-12-25
    相关资源
    最近更新 更多