Java:在char数组中计数“ a”,计数错误的值

时间:2018-09-06 17:56:30

标签: java arrays count char letter

public static void main(String[] args) {
    int count = 0;
    char[] array = {'а', 'g', 'r', 'e', 'r', 's', 'a', 'х', 'ј', 'a'};
    //char[] array = {'p', 'a', 'а', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'а'};
    //char[] array = {'a', 'b', 'b', 'c', 'k', 'a', 'a'};

    for (int i = 0; i < array.length; i++) {
        if (array[i] == 'a') {
            count++;
        }
        //System.out.println(count);
    }
    System.out.println("Letter 'a' " + count + " times.");
}

我在这里有一些“特定”问题。 如果我检查第一个数组,结果是2而不是3。 如果我检查第二个数组,结果是8而不是10。 当我检查第三个数组时,一切正常。

您可以取消注释System.out.println(count);行,并以奇怪的方式看待错误计数。

我想知道是什么问题。

先谢谢了。 问候。

1 个答案:

答案 0 :(得分:9)

第一个'а'不是a

http://unicode.scarfboy.com/?s=%D0%B0

它是CYRILLIC SMALL LETTER A(编码为U+0430),与a(编码为U+0061,名称为LATIN SMALL LETTER A)不同通常在拉丁字母中使用。 Java没错,实际上有两个元素是拉丁语a并在拉丁语a的代码点编码。

在第二个数组中,此问题仍然存在,至少在第二个数组的第二个“ a”处仍然存在。

之所以出现,是因为如上所述的字符评估是通过比较代码点完成的(这也是char类型可以被视为整数的原因)。在幕后,计算机基本上是在问自己61是否是430,这显然是不正确的。