Java 如何比较包含相同字符的两个字符串
我的问题是,我有两个字符串,比如String1和String2。现在我想检查这两个字符串是否包含相同的字符,而不考虑它们的序列 假设Java 如何比较包含相同字符的两个字符串,java,Java,我的问题是,我有两个字符串,比如String1和String2。现在我想检查这两个字符串是否包含相同的字符,而不考虑它们的序列 假设String1=“qwerty”,String2=“qywter”。现在,这些字符串包含相同的字符,但顺序不同。那么,是否有任何函数可以用来显示这些字符串包含相同的字符??equals()方法可以做到吗 非常感谢您的帮助。您可以使用String.equals,尽管是间接的。首先,您需要一个助手方法: char[] chars1 = string1.toCharArr
String1=“qwerty”
,String2=“qywter”
。现在,这些字符串包含相同的字符,但顺序不同。那么,是否有任何函数可以用来显示这些字符串包含相同的字符??equals()方法可以做到吗
非常感谢您的帮助。您可以使用
String.equals
,尽管是间接的。首先,您需要一个助手方法:
char[] chars1 = string1.toCharArray();
char[] chars2 = string2.toCharArray();
Arrays.sort(chars1);
Arrays.sort(chars2);
return Arrays.equals(chars1, chars2);
// given a String, sorts its chars and return it as another String
public static String sorted(String s) {
char[] arr = s.toCharArray();
Arrays.sort(arr);
return new String(arr);
}
然后你可以有:
String s1 = "qwerty";
String s2 = "qywter";
System.out.println(sorted(s1)); // eqrtwy
System.out.println(sorted(s1).equals(sorted(s2))); // true
System.out.println(
usedChar("xxxyyy").equals(usedChar("xy"))
); // true
System.out.println(
usedChar("xyz").equals(usedChar("abc"))
); // false
请注意,这不是最有效的算法——它是O(nlogn)
time,并且使用了额外的空间——但对于短字符串应该可以很好地工作。对于长字符串,您可能希望手动遍历每个char
(或Unicode代码点)(而不是tocharray()
),或者使用线性时间
如果您不关心特定的字符计数匹配(例如,“xxxyyy”
和“xy”
具有相同的字符,尽管数字不同),则可以使用类似集合的表示()
这取决于您是真的想要字符还是真的想要代码点,然后,您是否想要计算重复项也很重要。这里有一个解决方案:
public class a {
public static void main(String[] args) {
String s1 = "qwerty";
String s2= "qywter";
System.out.println(codePointSet(s1).equals(codePointSet(s2)));
}
public static Set<Integer> codePointSet(String s) {
Set<Integer> set = new TreeSet<Integer>();
for (int i = 0, cp; i < s.length(); i += Character.charCount(i)) {
cp = s.codePointAt(i);
set.add(cp);
}
return set;
}
}
公共a类{
公共静态void main(字符串[]args){
字符串s1=“qwerty”;
字符串s2=“qywter”;
System.out.println(codePointSet(s1).equals(codePointSet(s2));
}
公共静态集代码点集(字符串s){
Set=新树集();
for(int i=0,cp;i
String.equals()
不适用于您的特定情况。您可能需要编写自己的方法,以便以这种方式使字符串相等
int[] f = new int[(int)char.MaxValue];
foreach (var c in string1) f[(int)c]++;
foreach (var c in string2) f[(int)c]--;
return f.Max() == 0 && f.Min() == 0;
当string1.length()>>char.MaxValue时,这是更好的解决方案,并且它具有更低的大O表示法复杂性
编辑这实际上是C#代码,但在
Java
中很容易获得类似的结果。如果您需要比较一个长字符串,并且不需要成功的保证,您可以这样做:
希望这有帮助如果它们具有相同的字符,但字符数不同,结果应该是什么?(例如“qwerty”和“qywtery”?)它们包含相同的字符,但字符数不同。有趣的方法,但肯定不是Java。@prasad-我不理解你的评论,我的意思是,“返回数组。等于(chars1,chars2);”语句返回布尔值或int??
int[] f = new int[(int)char.MaxValue];
foreach (var c in string1) f[(int)c]++;
foreach (var c in string2) f[(int)c]--;
return f.Max() == 0 && f.Min() == 0;