2010-10-21 192 views
6

有没有办法检查两个字符串是否包含相同的字符。例如,检查2个字符串是否包含相同的字符?

abc, bca -> true 
aaa, aaa -> true 
aab, bba -> false 
abc, def -> false 
+0

的可能重复的[检查两个字符串是否彼此的排列](HTTP:// stackoverflow.com/questions/2131997/checking-if-two-strings-are-permutations-of-each-other) – finnw 2010-10-21 09:07:16

回答

20

将每个字符串转换为char [],对该数组进行排序,然后比较两者。简单。

private boolean sameChars(String firstStr, String secondStr) { 
    char[] first = firstStr.toCharArray(); 
    char[] second = secondStr.toCharArray(); 
    Arrays.sort(first); 
    Arrays.sort(second); 
    return Arrays.equals(first, second); 
} 
+0

...并删除重复es比较 – testalino 2010-10-21 07:55:10

+6

不,如果我们删除重复项,那么“aab,bba”将返回true,并将其指定为返回false。 – GaryF 2010-10-21 07:56:49

+0

是的,你是对的 – testalino 2010-10-21 08:00:05

1

您可以将字符串转换成字符数组,数组排序和比较他们的阵列:

String str1 = "abc";     
String str2 = "acb"; 
char[] chars1 = str1.toCharArray(); 
char[] chars2 = str2.toCharArray(); 
Arrays.sort(chars1); 
Arrays.sort(chars2); 

if(Arrays.equals(chars1,chars2)) { 
     System.out.println(str1 + " and " + str2 + " are anagrams"); 
} else { 
     System.out.println(str1 + " and " + str2 + " are not anagrams"); 
} 
0

这里:

String str1 = "abc"; 
    String str2 = "cba"; 
    /* create sorted strings */ 

/* old buggy code 
    String sorted_str1 = new String(java.utils.Arrays.sort(str1.toCharArray())); 
    String sorted_str2 = new String(java.utils.Arrays.sort(str2.toCharArray())); 
*/  
/* the new one */ 
char [] arr1 = str1.toCharArray(); 
char [] arr2 = str2.toCharArray(); 
java.utils.Arrays.sort(arr1); 
java.utils.Arrays.sort(arr2); 
String sorted_str1 = new String(arr1); 
String sorted_str2 = new String(arr2); 

if (sorted_str1.equals(sorted_str2)) { 
     /* true */ 
    } else { 
     /* false */ 
    } 
+1

Arrays.sort(..)具有返回类型的void,所以不能直接在String构造函数中使用它。 – GaryF 2010-10-21 08:01:23

+0

你是对的。我已更正了代码并再次发布。 – 2010-10-21 08:08:10

6

一个非常简单的 - 但不是很有效 - 这样做的方法是,将你的String s转换为char数组,然后在它们上使用java.util.Arrays.sort,并返回String并比较相等性。 如果你的字符串在几千个字符以下,那应该是非常好的。

如果您有几个字节的字符串,您可能需要创建一个数组,每个字符的计数(使用其代码作为索引),对每个字符的计数添加一个字符串,传递第二个字符串删除一个。如果你在第二次过程中的任何时候都落在0以下,那么它们的字符不会相同。当你完成第二个字符串而没有错误时,如果它们具有相同的长度(你应该首先检查它),那么确定它们具有相同的字符。
第二种方法比排序字符串要复杂得多,如果你想使用unicode字符串,它需要一个大数组,但是如果你只有128个字符的ASCII字符集,并且很好更快。
如果您的字符串中没有数百万字符,请不要打扰。对字符串进行排序要容易得多,对于只有几十个字符的字符串来说,排序速度并不会太慢。

+0

+1指出不同解决方案的优缺点 – sleske 2010-10-21 08:42:47

3

为A(挑剔;-))边注:

请注意,这里提出的解决方案仅适用于从Basic Multilingual Plane的Unicode(BMP)字符的字符串组成的工作。

的BMP之外的字符被表示为在Stringchar,所以你需要格外注意,所以你保持对在一起。血腥的细节请参阅java.lang.Character的Javadocs。

幸运的是,BMP以外的大多数字符都比较奇特。即使大部分日语和汉语都在BMP中...

+0

实际上,这里的解决方案在BMP之外工作就好了。问题在于它们不适用于非标准化的字符串;问题是“é”可以写成单个字符,也可以写成“e”和重音。 (这对于一些欧洲语言来说是个问题,也很少有人会遇到这个问题。) – 2010-10-21 08:17:33

+0

@Donal Fellows:他们如何在BMP之外工作?来自BMP外部的字符将被表示为一对代理,即两个“字符”。如果你然后调用例如'Arrays.sort(chars1)',不知道替代品的排序功能,会高兴地撕开替代品并产生垃圾数据。或者我错过了什么? – sleske 2010-10-21 08:37:23

+0

@Donal Fellows:但当然你说得对,问题也会出现在字符组合中。顺便说一句,使用规范化的字符串是不够的,因为有几种不同的规范化,有些使用组合字符。 – sleske 2010-10-21 08:41:28

1

考虑为给定字符串创建签名。使用数字和字符。

a-count:b-count:c-count:.....:z-count:(如果需要,可以扩展为大写)。

然后比较签名。对于非常大的字符串,这应该更好地扩展。

作为快捷方式,请检查长度。如果它们不匹配,则返回false。

2

也许这不是最快的答案,但必须最短的答案。

boolean hasSameChar(String str1, String str2){ 
    for(char c : str1.toCharArray()){ 
    if(str2.indexOf(c) < 0) return false; 
    } 
    for(char c : str2.toCharArray()){ 
    if(str1.indexOf(c) < 0) return false; 
    } 
    return true; 
} 
0

这里:

import java.util.Arrays; 

公共类CompareString {

String str = "Result"; 
String str1 = "Struel"; 

public void compare() { 
    char[] firstString = str.toLowerCase().toCharArray(); 
    char[] secondString = str1.toLowerCase().toCharArray(); 

    Arrays.sort(firstString); 
    Arrays.sort(secondString); 

    if (Arrays.equals(firstString, secondString) == true) { 
     System.out.println("Both the string contain same charecter"); 
    } else { 
     System.out.println("Both the string contains different charecter"); 
    } 
} 

public static void main(String[] args) { 
    CompareString compareString = new CompareString(); 
    compareString.compare(); 
} 

}

相关问题