比较具有不同顺序的字符串

时间:2012-05-02 21:11:51

标签: objective-c ios

我有一个比较字符串的if语句,但我想比较具有相同单词但顺序不同的字符串并将其返回为true。

字符串1 a,b,c

字符串2 b,c,a

如何比较它们并让if语句将其视为相同的字符串?

5 个答案:

答案 0 :(得分:5)

使用componentsSeperatedByString分隔字符串:使用任何字符串分隔单词(逗号,空格)并将结果放入NSSet。对两个字符串执行此操作并比较集合是否相等。

使用mutableArray而不是Set的修改方法,用于考虑重复字符串的问题(如评论中所述):

-(BOOL) string: (NSString*) string1 isEqualTo: (NSString*) string2 {
  if (string1.length != string2.length) return NO;
  if ([string1 isEqualToString: string2]) return YES;

  NSMutableArray *array1 = [NSMutableArray arrayWithArray: [string1 componentsSeperatedByString: @","]];
  NSMutableArray *array2 = [NSMutableArray arrayWithArray: [string2 componentsSeperatedByString: @","]];

  [array1 sortUsingSelector: @selector(compare:)];
  [array2 sortUsingSelector: @selector(compare:)];

  return [array1 isEqualToArray: array2];
}

答案 1 :(得分:2)

将每个字符串拆分为一个单词数组。对数组进行排序。然后比较数组中的每个单词。

    NSString *string1 = @"This is a test";
    NSString *string2 = @"test a is This";
    NSArray *wordsOne = [string1 componentsSeparatedByString:@" "];
    NSArray *wordsTwo = [string2 componentsSeparatedByString:@" "];

    NSMutableArray *wordsOneCopy = [NSMutableArray arrayWithArray:wordsOne];
    NSMutableArray *wordsTwoCopy = [NSMutableArray arrayWithArray:wordsTwo];

    [wordsOneCopy removeObjectsInArray:wordsTwo];
    [wordsTwoCopy removeObjectsInArray:wordsOne];

    if (wordsOneCopy.count == 0 && wordsTwoCopy.count == 0) // the strings contained the same words, perhaps different order

答案 2 :(得分:1)

如果您的字符串将始终采用逗号分隔格式,请尝试编写一个返回BOOL的方法,该方法将字符串分开,然后比较内容。 (写出这种脏的ARC风格)。

-(BOOL)compareWordsInString:(NSString*)stringA withString:(NSString*)stringB
{
    NSArray *arrayA = [stringA componentsSeparatedByString:@","];
    NSArray *arrayB = [stringB componentsSeparatedByString:@","];
    NSSet *setA = [[NSSet alloc] initWithArray:arrayA];
    NSSet *setB = [[NSSet alloc] initWithArray:arrayB];

    return [setA isEqualToSet:setB];
}

然后,您可以在if

中调用此方法
if([self compareWordsInString:@"a,b,c" withString:@"b,c,a"])
{
    // do work
}

请注意如果单词的数量必须完全匹配且在第二个字符串中只有一个对应的匹配,那么这将无法正常工作NSSet将在比较{{1到@"a,a,b,b,c,c,c"因为每个对象只会被添加到集合中一次。

答案 3 :(得分:0)

您可以做的是将字符串组件(单词)转换为数组,对数组进行排序并进行比较。这样,您只会比较单词,而不是顺序。

以下是一个例子:

NSMutableArray *array1 = [NSMutableArray arrayWithArray:[string1 componentsSeparatedByString:@","]];
NSMutableArray *array2 = [NSMutableArray arrayWithArray:[string2 componentsSeparatedByString:@","]];

NSComparator comparator = ^(NSString *s1, NSString *s2) {
    return [s1 compare:s2];
};

[array1 sortUsingComparator:comparator];
[array2 sortUsingComparator:comparator];

if ([array1 isEqualToArray:array2])
{
    //do work
}

[array1 isEqualToArray:array2]调用会告诉您字符串是否相似。

修改

在回复@ deanWombourne的评论时,我将涉及NSSet的原始代码更改为上面的代码,所以感谢@deanWombourne的正确和有用的评论。 (感谢@Kai因为糟糕的编辑而打电话给我。不会再发生了。)

答案 4 :(得分:0)

没有排序:

-(BOOL)isSameWordsInString:(NSString *)string1 andString:(NSString *)string2
{
  if(string1.length != string2.length)
  {
    return NO;
  }
  if([string1 isEqualToString:string2])
  {
    return YES;
  }
  NSMutableArray *array1 = [NSMutableArray arrayWithArray:[string1 componentsSeparatedByString:@" "]];
  NSMutableArray *array2 = [NSMutableArray arrayWithArray:[string2 componentsSeparatedByString:@" "]];
  if(array1.count != array2.count)
  {
    return NO;
  }
  for(NSString *word in array1)
  {
    if(![array2 containsObject:word])
    {
      return NO;
    }
    //EDIT on comment by deanWombourne
    [array2 removeObject:word];
    //END EDIT
  }
  return YES;
}