【问题标题】:Extracting strings from a NSArray of objects, based on a array of NSStrings基于 NSStrings 数组从 NSArray 对象中提取字符串
【发布时间】:2010-11-17 23:37:59
【问题描述】:

好的,这有点晦涩难懂,但让我头疼。

如果你有一个字符串数组

{@"1", @"2", @"4"}

你有一个食谱对象数组

{ {recipe_name:@"Lasagna", recipe_id:@"1"}
  {recipe_name:@"Burger", recipe_id:@"2"}
  {recipe_name:@"Pasta", recipe_id:@"3"}
  {recipe_name:@"Roast Chicken", recipe_id:@"4"}
  {recipe_name:@"Sauerkraut", recipe_id:@"5"}
}

我将如何使用第一个数组创建这样的数组:

{@"Lasagna", @"Burger", @"Roast Chicken"}

换句话说,它获取第一个数组中的数字并创建一个 recipe_names 数组,其中 recipe_id 与数字匹配...

【问题讨论】:

    标签: iphone objective-c ios nsarray


    【解决方案1】:

    使用NSPredicate 指定您想要的对象类型,然后使用-[NSArray filteredArrayUsingPredicate:] 精确选择这些对象:

    NSArray *recipeArray = /* array of recipe objects keyed by "recipe_id" strings */;
    NSArray *keyArray = /* array of string "recipe_id" keys */;
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"recipe_id IN %@", keyArray];
    NSArray *results = [recipeArray filteredArrayUsingPredicate:pred];
    

    NSPredicate 使用自己的迷你语言从格式构建谓词。格式语法记录在"Predicate Programming Guide."

    如果您的目标是 iOS 4.0+,更灵活的选择是使用-[NSArray indexesOfObjectsPassingTest:]

    NSIndexSet *indexes = [recipeArray indexesOfObjectsPassingTest:
            ^BOOL (id el, NSUInteger i, BOOL *stop) {
                NSString *recipeID = [(Recipe *)el recipe_id];
                return [keyArray containsObject:recipeID];
            }];
    NSArray *results = [recipeArray objectsAtIndexes:indexes];
    

    【讨论】:

      【解决方案2】:

      您的食谱对象数组基本上是一个字典:

      NSDictionary *recipeDict =
        [NSDictionary dictionaryWithObjects:[recipes valueForKey:@"recipe_name"]
                                    forKeys:[recipes valueForKey:@"recipe_id"]];
      

      在字典上你可以使用键值编码方法:

      NSArray *result = [[recipeDict dictionaryWithValuesForKeys:recipeIDs] allValues];
      

      【讨论】:

        【解决方案3】:

        假设您的 Recipe 对象是键值兼容的(它们几乎总是如此),您可以使用如下谓词:

        NSArray *recipes= // array of Recipe objects
        NSArray *recipeIDs=[NSArray arrayWithObjects:@"1",@"2",@"3",nil];
        NSPredicate *pred=[NSPredicate predicateWithFormat:@"recipe_id IN %@", recipeIDs];
        NSArray *filterdRecipes=[recipes filteredArrayUsingPredicate:pred];
        NSArray *recipeNames=[filterdRecipes valueForKey:@"recipe_name"];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-05
          • 2017-10-06
          • 1970-01-01
          相关资源
          最近更新 更多