字符数组中的出现

时间:2018-11-30 03:56:27

标签: java arrays char

我有这个问题, 线程“主”中的异常java.lang.ArrayIndexOutOfBoundsException:100         在Exercise_12_2.main(Exercise_12_2.java:28) 当我试图仅简单地计算字符数组中字母的出现时。我似乎无法全神贯注于如何解决这个问题。我已经去了几个小时。请帮助我走上正确的轨道。

import java.util.Scanner;

public class Exercise_12_2
{
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in); // Setup scanner

        char[] charArray = new char[100];
        int[] counts = new int[26];
        char tempinput = '?';

        System.out.print("Enter letters (or ! to quit): ");

        while (tempinput != '!')
        {
            tempinput = (input.next()).charAt(0);
            charArray[tempinput]++;

            for (int c = 'a'; c <= 'z'; c++)
            {
                for (int k = 0; k <= charArray.length; k++)
                {
                    if (c == charArray[k])
                    {
                        counts[c] += 1;
                    }
                }
            }
        }
    }
    public static void displayCounts(int[] counts)
    {
        for (int i = 0; i < counts.length; i++)
        {
            if ((i + 1) % 10 == 0)
            {
                System.out.println(counts[i] + " " + (char)(i + 'a'));
            }
            else
            {
                System.out.print(counts[i] + " " + (char)(i + 'a') + " ");
            }
        }
    }
}

到目前为止,这是我的代码。请帮助我。

{{1}}

3 个答案:

答案 0 :(得分:1)

java.lang.ArrayIndexOutOfBoundsException: 100表示您要查询仅包含100个元素的数组的第101个元素。请记住,Java数组的索引从0开始。

从中您可能可以分辨出此行的原因:

for (int k = 0; k <= charArray.length; k++)

charArray.length100,所以您要运行直到k101,这意味着您尝试使用charArray[100]来请求{的第101个元素{1}},但是 charArray只有100个元素。

如果将charArray切换为k <= charArray.length,您应该走得更远。

在不相关的注释上,k < charArray.length不起作用。 counts[c] += 1;的{​​{1}}值是其ascii值。例如,字母intchar,因此您将远离a数组的末尾。这也不考虑大小写(数值不同)的情况。

答案 1 :(得分:1)

如果使用适当的数据结构,此问题会变得更容易 。例如,我将使用Map<Character, Integer>保留计数,然后对其进行迭代显示。喜欢,

Scanner input = new Scanner(System.in); // Setup scanner
System.out.print("Enter letters (or ! to quit): ");
Map<Character, Integer> map = new HashMap<>();
char ch;
while ((ch = Character.toLowerCase(input.next().charAt(0))) != '!') {
    map.put(ch, map.getOrDefault(ch, 0) + 1);
}
System.out.println("Counts:");
for (int c = 'a'; c <= 'z'; c++) {
    if (map.containsKey((char) c)) {
        System.out.printf("%c\t%d%n", c, map.get((char) c));
    }
}

我用您的示例输入进行了测试,并得到了要求:

Enter letters (or ! to quit): a a a b b c !
Counts:
a   3
b   2
c   1

答案 2 :(得分:0)

我认为在创建[a, a, b c, d, !, ..]的字符数组之后,下面的代码足以计算每个字母[a-z]的计数。

for (int k = 0; k < charArray.length; k++)
    {
        char c = charArray[k];
        if (c >= 'a' && c <= 'z' )
        {
            counts[c - 'a'] += 1;
        }
    }