首页 > 解决方案 > 比较相同的字符会产生不同的结果

问题描述

我正在尝试制作一个程序来计算用户输入的短语中字母的所有实例。例如,短语“Hello”将输出"h: 1", "e: 1", "l: 2", "o: 1".
我已经想出了如何找到和计算所有字母,除了"a". 当我"a"多次与自身进行比较时,它每次都会返回一个不同的值(所以这句话"aaaa"会给我a: 1, b: 1, c: 1, d: 1)这是我正在使用的代码:

int[] countLetter = new int[26];
char[] alphabet = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
phrase = phrase.toLowerCase();
String a = "a";
for (int i = 0; i<phrase.length(); i++ ) {
    char count = phrase.charAt(i);
    if (Character.isLetter(count))
        countLetter[a.compareTo(phrase.substring(i))*-1] = countLetter[a.compareTo(phrase.substring(i))*-1] + 1;
}
for (int i = 0; i<26; i++) {
    if (countLetter[i]>0) {
        System.out.println(alphabet[i] + ": " + countLetter[i]);
    }
}

我不确定我做错了什么,那么我怎样才能让“a”保持不变?

标签: javacount

解决方案


您的代码中的错误是由于 compareTo 返回其结果的方式。正如 Mureinik 所说,“你永远不应该依赖 compareTo 的确切返回值”。我将尝试解释出了什么问题。

如果两个字符串不同,则它们在某个索引处具有不同的字符,该索引是两个字符串的有效索引,或者它们的长度不同,或两者兼而有之。如果它们在一个或多个索引位置具有不同的字符,则设 k 为此类索引中的最小的。然后 compareTo 方法返回

    return str1.charAt(k) - str2.charAt(k);

如果它们没有不同的索引位置,则较短的字符串按字典顺序位于较长的字符串之前。在这种情况下, compareTo 返回字符串长度的差值。

    return str1.length() - str2.length();

当短语字符串是“aaaaa”时,对于 0-4 的不同值,会发生这种情况,

    //when i = 0
    
    a.compareTo(phrase.substring(i))  
    
    //"a".compareTo("aaaaa")
    //length of "a" - length of "aaaaaa"
    //which is -4

在将它与 -1 相乘时,-4 变为 4,这是字母“e”的索引。你可以检查一下 i 的其他值,你会明白这就是你如何得到 d、c、b 和 1 的计数器。

我希望我能帮助你找到你的错误。请检查此链接以获取有关 compareTo() https://www.w3resource.com/java-tutorial/string/string_compareto.php的更多详细信息


推荐阅读