我们说我有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());
}
}
答案 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());