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

时间:2014-12-05 21:44:15

标签: java string

我们说我有2个字符串,我需要计算他们独特字符之间的差异。很简单:

String s1 = "abcd";
String s2 = "aaaacccbbf";
//answer: 1

答案是1,因为没有" f"在s1变量中。

但是மா或汉字等字符或其他非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());
    }
}

3 个答案:

答案 0 :(得分:0)

கு是一个特殊字符,它是通过合并க和formed形成的,因此创建了2个不同的字符,并且没有1个单char值。您正在循环char中的s2,因此您无法找到该角色。

Java并没有解决这个问题,因为String.substring()String.charAt()都使用char

结论,使用Java的默认库无法做到这一点。

答案 1 :(得分:0)

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());

答案 2 :(得分:0)

您的符号கு是泰米尔语脚本的复合形式,其中包含两个Unicode字符க் + உ(0B95 + 0BC1)。如果您打算使用Tamil脚本,您必须找到所有类似的字符:

    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());

正则表达源: How to Match a Single Unicode Grapheme