Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java,计算字符串中唯一字符之间的差异_Java_String - Fatal编程技术网

Java,计算字符串中唯一字符之间的差异

Java,计算字符串中唯一字符之间的差异,java,string,Java,String,假设我有两个字符串,我需要计算它们唯一字符之间的差异。很简单: String s1 = "abcd"; String s2 = "aaaacccbbf"; //answer: 1 答案是1,因为s1变量中没有f 但是像这样的角色呢மா 或漢字, 或任何其他非ASCII字符?如果我循环遍历这些字符串,其中一个字符கு 将计数2-3次作为单独字符,给我错误的答案: String s1 = "ab"; String s2 = "aaaகுb"; //answer: 2 (wrong!) 我尝试使用

假设我有两个字符串,我需要计算它们唯一字符之间的差异。很简单:

String s1 = "abcd";
String s2 = "aaaacccbbf";
//answer: 1
答案是1,因为s1变量中没有f

但是像这样的角色呢மா 或漢字, 或任何其他非ASCII字符?如果我循环遍历这些字符串,其中一个字符கு 将计数2-3次作为单独字符,给我错误的答案:

String s1 = "ab";
String s2 = "aaaகுb";
//answer: 2 (wrong!)
我尝试使用的代码:

class a {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s1 = sc.nextLine();
        String s2 = sc.nextLine();
        sc.close();

        String missingCharacters= "";

        for(char c : s2.toCharArray()) {
            if(!missingCharacters.contains(c+"") && !s1.contains(c+"")) 
                missingCharacters+= c;
        }

        System.out.println(missingCharacters.length());
    }
}

கு 是一个特殊的字符,它是由合并而成的க 和ு, 这样就创建了两个不同的字符,并且没有一个单独的字符值。您正在s2中的字符上循环,因此无法找到该字符本身

Java没有办法解决这个问题,因为String.substring和String.charAt都使用字符

总之,使用Java的默认库是不可能做到这一点的。

您的符号கு 是泰米尔文字的复合形式,包含两个Unicode字符க் + உ 0B95+0BC1。如果您计划使用泰米尔语脚本,您必须找到所有具有模式的相似字符:

Set<Integer> missing = new HashSet<>();
for (int i = 0; i < s1.length();) {
  int codePoint = s1.codePointAt(i);
  if (s2.indexOf(codePoint) == -1) {
    missing.add(codePoint); // takes care of duplicates
  }
  i += Character.charCount(codePoint);
}
System.out.println(missing.size());
    String s1 = "ab";
    String s2 = "aaaகுb";

    Pattern pattern = Pattern.compile("\\p{L}\\p{M}*");

    Matcher matcher = pattern.matcher(s2);
    Set<String> missingCharacters=new TreeSet<>();
    while (matcher.find()) {
        missingCharacters.add(matcher.group());
    }

    matcher = pattern.matcher(s1);
    while (matcher.find()) {
        missingCharacters.remove(matcher.group());
    }

    System.out.println(missingCharacters.size());
正则表达式来源:

看起来像கு 是unicode字符,ToCharray为您提供单个字节。你看,如果你不能在某个地方设置编码,我只是在我的机器上运行了你的代码,得到了ab对aaa的1குb、 这个问题的答案与您的代码可以正常工作有关漢字மா 以及除கு此外,它不适用于阿拉伯语字符:计数为2,空格字符空格栏,制表符被忽略。我想根据否决票获得反馈。Java不可能是愚蠢的;Java的图灵完成。您可能需要专门的库来识别字符粘在一起,但这并不意味着这是不可能的。您应该删除{after if s2…,或者在i+=…上方添加一个},我尝试使用字符串s1=ab,s2=aaa运行代码குb、 但它的输出为0。int代码点之后的快速调试只给出值97和98 A和b,但跳过特殊字符。使用带字符串s2=ab、s1=aaa的Java 1.7குb它给2,不是1@RuslanOstafiychuk您使用的是什么Java版本?@Charlie,jdk1.7_71但我刚才说答案是错误的:谢谢您的回答。然而,我并不是只使用泰米尔语脚本。您知道其他unicode字符的解决方案可能会导致相同的问题吗?例如:Thîs lóo̰ks we̐ird适用于我的解决方案,而不适用于您的代码。我在一些示例中测试了您的代码,但它不适用于க்ஷௌ 性格