java - 比较相同的字符会产生不同的结果
问题描述
我正在尝试制作一个程序来计算用户输入的短语中字母的所有实例。例如,短语“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”保持不变?
解决方案
您的代码中的错误是由于 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的更多详细信息
推荐阅读
- google-apps-script - 如果表的大小为 13 个条目,则获取列表大小并检索它将占用多少个表的函数
- azure - Azure App Insights:如何限制特定域或 IP 地址的日志信息
- iframe - 在移动视图中如何让 iframe 重新定位
- java - CSV 中的 Java 数据存储
- subquery - 在 Informix 中使用子查询进行左外连接
- docker-swarm - 在 Docker Swarm 中运行 LINSTOR
- python-3.x - TypeError:无法将此 __setattr__ 应用于对象 - PySide2 - Python 3.6
- javascript - 自 Chrome 86 起无法为文件请求配额
- google-apps-script - 如何从活动电子表格中的选定图表中获取图表信息?(谷歌应用脚本)
- php - PHP move_uploaded_file 不成功且不显示警告