[英]Java: Array Index Out of Bounds Exception 2
我正在編寫一個簡單的Java程序,要求用戶輸入一個字符串,然后計算並顯示字母表中每個字母出現在該字符串中的次數。 編譯時,出現以下錯誤:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -25
at StringLetters.countLetters(StringLetters.java:43)
at StringLetters.main(StringLetters.java:23)
我看過其他解決方案,類似於我的問題,但沒有一個有幫助。 有人有什么想法嗎? 謝謝。
import java.util.Scanner;
public class StringLetters
{
public static void main(String[]args)
{
Scanner scan = new Scanner(System.in);
System.out.println("Please enter a string of words.");
String s = scan.nextLine();
int[] counts = countLetters(s.toUpperCase());
for(int i = 0; i < counts.length; i++)
{
if (counts[i] != 0)
{
System.out.println((char)('a' + i) + " appears " + counts[i] + ((counts[i] == 1) ? "time" : " times"));
}
}
}
public static int[] countLetters(String s)
{
int[] counts = new int[26];
for (int i = 0; i < s.length(); i++)
{
if(Character.isLetter(s.charAt(i)))
{
counts[s.charAt(i) - 'a']++;
}
}
return counts;
}
}
好吧,顯然, counts[s.charAt(i) - 'a']
的索引大於25。看起來您假設所有輸入都是小寫字母,即使您將countLetters
方法傳遞為大寫字母也是如此字符串( countLetters(s.toUpperCase());
)。
您可能應該將其更改為counts[s.charAt(i) - 'A']
。 當然,這僅適用於大寫字母,但這就是您當前傳遞給此方法的內容。
在傳遞給count方法的參數String中,您的字母不是小寫英文字母,並且破壞了代碼。
實際上,它們都不是小寫字母,因為您正在調用s.toUpperCase()
,並且似乎要調用s.toLowerCase()
。 另外,您需要過濾出標點符號和所有非字母字符。 您已經在這里完成了: if (Character.isLetter(s.charAt(i)))
。
因此,只需將s.toUpperCase()
更改為s.toLowerCase()
,就可以了。
首先,您的問題-您如何處理大寫字母?
顯然,在您的用例中,您要執行countLetters(s.toUpperCase())
然后執行countLetters(s.toUpperCase())
- 'a'
。 這給出了非常奇怪的結果:
(int)'A' - (int)'a' = -25
(int)'Z' - (int)'a' = -7
一個簡單的方法是使用Map
。 使用Java 8:
final Map<Character, Integer> counts = input.toUpperCase().chars().
collect(HashMap::new, (m, l) -> m.merge((char) l, 1, Integer::sum), Map::putAll);
在很多情況下,isLetter都可以返回true(請查看其javadoc)。 特別是對於大寫字符(peter> petrov是正確的,您可能不想轉換為大寫...)
我建議實施一個更基本的測試:
Char c = s.charAt(i);
if('a' <= c && c <= 'z')
{
counts[c - 'a']++;
}
else if('A' <= c && c <= 'Z')
{
counts[c - 'A']++;
}
您如何計算大寫字母? 似乎對HashMap很好用。 大寫字母的ASCII值低於小寫字母的ASCII值。 您的索引超出范圍似乎是由大寫字母引起的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.