iOS:将单个字符串中的元素数组附加到其他数组

时间:2014-12-02 11:40:33

标签: objective-c iphone nsstring nsarray

我正在开发app包含字典格式的值,并在数组中获取这些值,如下所示     注意:_detailedarray是一个可变数组。

[_detailedarray addObject:[NSDictionary dictionaryWithObjectsAndKeys:_firstname ,    
  @"first_name" , _lastname , @"last_name" ,_phoneNumber,@"phone_Number" ,nil]];
    NSArray *ar=[[NSArray alloc]init];
    self.filtereditems=[NSMutableArray arrayWithCapacity:[_detailedarray count]];

    NSLog(@"array is,%@",ar);
    CFRelease(phoneNumbers);

}
  [self.nametxt addTarget:self.autoCompleter action:@selector(textFieldValueChanged:) forControlEvents:UIControlEventEditingChanged];

_firstnamestring=[_detailedarray valueForKey:@"first_name"]; 

//_firstnamestring is a string and same _lastnamestring and _phnostring///

_lastnamestring=[_detailedarray valueForKey:@"last_name"];
_phonenostring=[_detailedarray valueForKey:@"phone_Number"];
_totalarray = [[NSMutableArray alloc] initWithObjects:_firstnamestring,   
 _lastnamestring, _phonenostring, nil];

每个字符串包含6个值,我的问题是如何将这些数组中的元素添加到一个数组中,这意味着

 _ firstnamestring contains 6 values and  _phonenostring cointains 6 values and   
 _lastnamestring contains 6 values how to append the first name,last name and phone 
  no strings at every object at index and keep in single array.

1 个答案:

答案 0 :(得分:0)

查看您的代码示例,看起来您有一个名为_detailedArray的数组,它是一个包含三个键的词典数组,first_namelast_namephone_Number 。当您使用字典数组上的特定键调用valueForKey时,您将获得该键值的数组。这很有趣,但在这里并没有用。

我可能会建议一些方法:

  1. 如果你真的需要这个"第一个电话"字符串,你应该直接构建它:

    NSMutableArray *contactStrings = [NSMutableArray array];
    for (NSDictionary *contact in _detailedArray) {
        [contactStrings addObject:[self stringForContact:contact]];
    }
    

    stringForContact的定义如下:

    - (NSString *)stringForContact:(NSDictionary *)contact 
    {
        return [NSString stringWithFormat:@"%@ %@ %@", contact[@"first_name"], contact[@"last_name"], contact[@"phone_Number"]];
    }
    

    显然,您可以扩展它以处理各种情况(例如,没有名字,没有姓氏等)。但它说明了一般的想法。

  2. 我必须承认,我并不为上述构建字符串数组的方法而疯狂。首先,你占用了两倍的内存而没有任何好处(例如,你一次只能显示20个联系人,但你可能已经为不必要的数千个联系人建立了这个整个阵列。)

    此外,您现在有两个必须保持同步的阵列,即contactStrings_detailedArray。例如,如果您在将来某个日期添加排序功能并按姓氏排序_detailedArray,则必须重建contactStrings数组(显然您无法对contactStrings本身进行排序,因为它没有关于字符串的哪个部分是名字的有意义的数据,以及哪个部分是姓氏等等。)

    我个人更喜欢单独坚持_detailedArray。然后,联系人字符串表示的呈现成为表示问题,而不是重复的模型结构。

    例如,如果在表格视图中显示_detailedArray个联系人,则cellForRowAtIndexPath可能如下所示:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *cellIdentifier = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    
        NSDictionary *contact = _detailedArray[indexPath.row];
        cell.textLabel.text = [self stringForContact:contact];
    
        return cell;
    }
    

    因此,不要构建另一个与_detailedArray重复的字符串数组,而只需使用_detailedArray本身。

  3. 更好的是,正如Anoop Vaidya建议的那样,我可能会建议您设计自己的自定义Contact类,并用一组自定义对象替换字典数组。然后你可以使stringForContact方法成为这个模型Contact类的实例方法(它可能属于它),而不是在视图控制器中编码。

    但希望它说明了这个想法:模型应该捕获底层数据的结构,并且您可以将该对象的字符串表示形式设置为您根据需要调用的单独方法,而不是构建重复的字符串数组。 / p>