首页 > 解决方案 > 是什么让“getCharNumber”方法不区分大小写,而它只检查小写字母(作者 CtCI)

问题描述

public class Common {

    public static int getCharNumber(Character c) {
        int a = Character.getNumericValue('a');
        int z = Character.getNumericValue('z');
        
        int val = Character.getNumericValue(c);
        if (a <= val && val <= z) {
            return val - a;
        }
        return -1;
    }
    
    public static int[] buildCharFrequencyTable(String phrase) {
        int[] table = new int[Character.getNumericValue('z') - Character.getNumericValue('a') + 1];
        for (char c : phrase.toCharArray()) {
            int x = getCharNumber(c);
            if (x != -1) {
                table[x]++;
            }
        }
        return table;
    }
}

上述算法用于测试字符串是否是回文的排列,由 CtCI (Cracking the Coding Interview) 编写。

我的问题:为什么getCharNumber方法不区分大小写?

我认为它应该区分大小写,因为它只检查小写字符。

标签: javacase-insensitive

解决方案


为什么 getCharNumber 不区分大小写?

getCharNumber方法使用 Java 的Character#getNumericValue(char)方法,它的JavaDoc特别指出:

大写字母 AZ('\u0041' 到 '\u005A')、小写字母('\u0061' 到 '\u007A')和全角变体('\uFF21' 到 '\uFF3A' 和 '\uFF41'通过 '\uFF5A') 形式具有从 10 到 35 的数值。这与 Unicode 规范无关,Unicode 规范不为这些 char 值分配数值。

这意味着例如对于字符Aa此 API 方法返回相同的值,即10,因此不区分大小写。


供参考,另请参阅


推荐阅读