Java 如何比较包含相同字符的两个字符串

Java 如何比较包含相同字符的两个字符串,java,Java,我的问题是,我有两个字符串,比如String1和String2。现在我想检查这两个字符串是否包含相同的字符,而不考虑它们的序列 假设String1=“qwerty”,String2=“qywter”。现在,这些字符串包含相同的字符,但顺序不同。那么,是否有任何函数可以用来显示这些字符串包含相同的字符??equals()方法可以做到吗 非常感谢您的帮助。您可以使用String.equals,尽管是间接的。首先,您需要一个助手方法: char[] chars1 = string1.toCharArr

我的问题是,我有两个字符串,比如String1和String2。现在我想检查这两个字符串是否包含相同的字符,而不考虑它们的序列

假设
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

中很容易获得类似的结果。如果您需要比较一个长字符串,并且不需要成功的保证,您可以这样做:

  • 确保字符串长度相同
  • 对于每个图像
  • 将所有字符相加(转换为整数)
  • 将字符的方块相加(再次转换为整数)
  • 比较平方和和和
  • 如果它们相同,则字符串包含相同的字符
  • 事实上,我花了一些时间试图找出这在哪里行不通,但我想不出一个。我的直觉告诉我这里遗漏了什么,或者这是一个很好的比较

  • 对两个字符串执行xor,如果xor为0,则部分确定

  • 如果xor为0,则查找两个字符串的ascii值之和,如果ascii和相同,则 两个字符串都是相同的


  • 希望这有帮助

    如果它们具有相同的字符,但字符数不同,结果应该是什么?(例如“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;