文字列を比較する if ステートメントがありますが、単語が同じで順序が異なる文字列を比較し、それを true として返したいと考えています。
文字列 1 a、b、c
ストリング 2 b、c、a
それらを比較して、if ステートメントで同じ文字列と見なすにはどうすればよいですか?
文字列を比較する if ステートメントがありますが、単語が同じで順序が異なる文字列を比較し、それを true として返したいと考えています。
文字列 1 a、b、c
ストリング 2 b、c、a
それらを比較して、if ステートメントで同じ文字列と見なすにはどうすればよいですか?
componentsSeperatedByString を使用して文字列を区切ります: 単語を区切る文字列 (コンマ、スペース) を使用して、結果を NSSet に入れます。両方の文字列に対してそれを行い、セットが等しいかどうかを比較します。
重複文字列の問題を考慮するために Set の代わりに mutableArray を使用する変更されたメソッド (コメントで説明されているように):
-(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];
}
各文字列を単語の配列に分割します。配列を並べ替えます。次に、配列内の各単語を比較します。
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
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 と評価されるため、単語数が正確に一致する必要があり、2 番目の文字列に対応する一致が 1 つだけある場合、これは正しく機能しないことに注意してください。@"a,a,b,b,c,c,c"
@"a,b,c"
できることは、文字列コンポーネント (単語) を配列に変換し、配列を並べ替えて比較することです。この方法では、順序ではなく単語のみを比較します。
次に例を示します。
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
s を含む元のコードを上記のコードに変更しました。@deanWombourne の正確で役立つコメントに感謝します。(そして、悪い編集について私に電話してくれた @Kai に感謝します。二度と起こりません。)
並べ替えなし:
-(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;
}