0

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

字符串 1 a,b,c

字符串 2 b,c,a

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

4

5 回答 5

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];
}
于 2012-05-02T21:21:36.443 回答
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
于 2012-05-02T21:28:01.410 回答
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在比较时将评估为 YES @"a,a,b,b,c,c,c"@"a,b,c"因为每个对象只会被添加到集合中一次。

于 2012-05-02T21:28:29.407 回答
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 的评论,我将涉及NSSets 的原始代码更改为上述代码,因此感谢@deanWombourne 的正确和有用的评论。(感谢@Kai 打电话给我进行糟糕的编辑。不会再发生了。)

于 2012-05-02T21:30:49.927 回答
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;
}
于 2012-05-03T08:03:18.993 回答