簡體   English   中英

Java:數組索引超出范圍異常2

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM