【问题标题】:Objective-C - NSArray to NSString with multiple delimitersObjective-C - 具有多个分隔符的 NSArray 到 NSString
【发布时间】:2015-03-19 06:42:28
【问题描述】:

我有一个 NSArray 字符串,我想将其放入单个 NSString 中,并在 objective-c 中使用多个分隔符分隔元素。

例如数组长这样。

[“迈克”、“兄弟”、“莎拉”、“姐姐”、“简”、“姐姐”]

我希望它们在字符串中看起来像这样。

"Mike,Brother; Sarah,Sister; Jane,Sister"

即人和关系用逗号分隔,兄弟姐妹用分号分隔。

【问题讨论】:

    标签: ios objective-c nsstring nsarray


    【解决方案1】:
    NSArray *input = [ @"Mike", @"Brother", @"Sarah", @"Sister", @"Jane", @"Sister" ];
    NSMutableArray *nameSiblingPairs = [NSMutableArray array];
    
    for (NSInteger i = 0; i < [input count]; i += 2)
        [nameSiblingPairs addObject:[NSString stringWithFormat:@"%@,%@", input[i], input[i + 1]]];
    
    NSString *output = [nameSiblingPairs componentsJoinedByString:@"; "];
    

    【讨论】:

    • 太棒了,谢谢@dreamlax。您能否编辑您的答案并展示如何做完全相反的事情。即从输出(NSString)到输入(NSArray)。
    • NSArray *array = [输出 componentsSeparatedByString:@","];
    • NSArray *array = [outputString componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@",;"]];查看我的答案了解更多详情
    【解决方案2】:
    NSArray *array = @[@"Mike", @"Brother", @"Sarah", @"Sister", @"Jane", @"Sister"];
    NSMutableArray* newArray = [[NSMutableArray alloc] init];
    for (int i = 1; i<[array count]; i+=2){
      [newArray addObject: [NSString stringWithFormat:@"%@,%@", array[i-1],array[i]]];
    }
    NSString* s = [newArray componentsJoinedByString:@"; "];
    

    【讨论】:

      【解决方案3】:

      这是一种更更好干净的方法

      NSArray *input = [ @"Mike", @"Brother", @"Sarah", @"Sister", @"Jane", @"Sister" ];
      NSMutableString *outputString = [NSMutableString string];
      NSArray *delimiters = [@",", @"; "];
      
      for(int i=0; i < outputString.count; ++ i) {
      
          [outputString appendString:[input objectAtIndex:i]];
      
          if (i < input.count - 1) {
              [outputString appendString:i % delimiters.count];
          }
      }
      

      要取回数组

      NSArray *array = [outputString componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@",; "]];
      

      这是一个动态代码,您可以在其中添加n 分隔符数量

      【讨论】:

      • indexOfObject: 是一个 O(n) 操作,使你的整体算法 O(n^2),而实际上它可以保持 O(n)。
      • 谢谢!更新了答案。
      【解决方案4】:

      带有appendFormatfor 循环将起作用:

      BOOL first=YES;
      NSMutableString *res = [NSMutableString string];
      for (int i = 0 ; i+1 < array.length ; i+=2) {
          if (!first) {
              [res appendString:@"; "];
          } else {
              first = NO;
          }
          [res appendFormat:@"%@,%@", array[i], array[i+1]];
      }
      

      NSMutableString 的使用有助于避免创建临时对象。

      当然这并不理想,因为数组中的项目是相关的。您最好制作可以存储名称和关系的对象,这样您就不必将它们存储在平面数组的相邻元素中。

      【讨论】:

        【解决方案5】:

        试试这个:

        - (NSString *)serialize:(NSArray *)array
        {
            NSUInteger count = [array count];
            NSAssert(count % 2 == 0,  @"Array count must be even");
            NSString *result = @"";
            NSUInteger i = 0;
            for (i = 0; i < count / 2 + 2 ; i+=2) {
                NSString *temp = [NSString stringWithFormat:@"%@,%@",array[i], array[i+1]];
        
                result = [result stringByAppendingString:temp];
                if (i < count / 2) {
                    result = [result stringByAppendingString:@"; "];
                }
            }
            return result;
        }
        

        【讨论】:

          【解决方案6】:

          试试这个:

          NSArray+Extension.h

          @interface NSArray (Extension)
          - (NSString *)componentsJoinedByStrings:(NSArray *)separatorStrings;
          @end
          

          NSArray+Extension.m

          @implementation NSArray (Extension)
          
          - (NSString *)componentsJoinedByStrings:(NSArray *)separatorStrings {
              NSMutableString *newString = [NSMutableString stringWithString:@""];
              for (NSInteger i = 0; i < [self count]; i += 1){
                  NSMutableString *tempString = [NSString stringWithFormat:@"%@ %@", self[i], separatorStrings[i% [separatorStrings count]]];
                  [newString appendString:tempString];
              }
              return newString
          }
          
          @end
          

          【讨论】:

            猜你喜欢
            • 2012-02-21
            • 1970-01-01
            • 2015-07-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-22
            相关资源
            最近更新 更多