【问题标题】:Compare two strings and remove common elements比较两个字符串并删除共同元素
【发布时间】:2012-12-19 14:05:56
【问题描述】:

我有两个逗号分隔的NSString,我只想从第一个字符串中删除相似的字符。

ex. str1 = 0,1,2,3
    str2 = 1,2.
    output -> str1 = 0,3 and str2 = 1,2.

我有一个选择,即在数组中用逗号分隔值分隔两个字符串。但它需要两个NSArray 并应用loop 然后删除公共元素,但这是非常繁琐的工作。 所以我想要一些简单而适当的解决方案来避免循环。

请帮我解决这个问题。

【问题讨论】:

    标签: iphone objective-c ios


    【解决方案1】:

    试试这个:

    不需要循环!!!

    您已获得所有必需的 API。

    NSString *str1=@"0,1,2,3";
    NSString *str2=@"1,2";
    
    NSMutableArray *arr1=[[NSMutableArray alloc]initWithArray:[str1 componentsSeparatedByString:@","]];
    
    [arr1 removeObjectsInArray:[str2 componentsSeparatedByString:@","]];
    NSLog(@"arr1 %@",arr1);
    /*
    NSMutableString *finalString=[NSMutableString new];
    
    for (NSInteger i=0; i<[arr1 count]; i++) {
        NSString *str=[arr1 objectAtIndex:i];
    
        [finalString appendString:str];
        if (i!=[arr1 count]-1) {
          [finalString appendString:@","];  
        }
    }
    */
    NSString *finalString=[arr1 componentsJoinedByString:@","];
    NSLog(@"finalString %@",finalString);
    

    【讨论】:

    • +1 如果您对字符串的默认 isEqual 实现感到满意,这是最短的
    • -1 从不可变数组中删除对象时,将 NSArray 转换为 NSMutableArray 会崩溃。请更改,然后我会 +1
    • (非常奇怪的)事情是componentsSeparatedByString 实际上返回了NSMutableArray 的一个实例,所以这段代码实际上并没有崩溃。但当然不应该依赖这一点。
    • @Anoop,谢谢你,它对我来说很好,但它返回了数组&我想要逗号分隔的字符串。你能修改你的代码吗?
    • @InderKumarRathore:已更改。
    【解决方案2】:

    类似的东西?

     NSString *string = @"0,1,2,3";
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self like '1' OR self like '2'"];
     NSLog(@"%@",[[string componentsSeparatedByString:@","] filteredArrayUsingPredicate:predicate]);
    

    【讨论】:

    • 但元素是动态的。
    • 它不应该是静态谓词,但谓词是正确的方式,恕我直言——它避免了手动 for 循环
    【解决方案3】:
        id str1=@"aa,ab,ac,cd,ce,cf";
        id str2=@"aa,ac,cd,cf";
        //no ab and no ce
    
        id cmps1 = [str1 componentsSeparatedByString:@","];
        id cmps2 = [str2 componentsSeparatedByString:@","];        
    
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT SELF IN %@", cmps2];
        NSArray *final = [cmps1 filteredArrayUsingPredicate:predicate]; 
        id str = [final componentsJoinedByString:@","];
        NSLog(@"%@", str);
    

    【讨论】:

      【解决方案4】:

      我能想到的唯一解决方案是:

      NSMutableArray* arr1 = [str1 componentsSeparatedByString:@","] mutableCopy];
      NSArray* arr2 = [str2 componentsSeparatedByString:@","];
      for (NSString* str in arr2) {
        [arr1 removeObject:str];
      }
      NSString* newString1 = [arr1 componentsJoinedByString:@","];
      

      这是你尝试的吗?如果“str1”看起来像“1,1,2,2,2”,那么您可能需要做更多的工作来消除重复项。但基本上就是这样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-29
        相关资源
        最近更新 更多