如何显示字符串中每个字母的频率?

时间:2018-10-22 17:05:31

标签: java string indexoutofboundsexception frequency

我希望我的代码显示每个字母的频率,但我却得到了ArrayIndexOutOfBoundsException。我无法发现自己​​做错了什么。

我该如何纠正?

这是我的代码:

public static void solution(String s) {
    char[] c = s.toCharArray();
    int j = 0, i = 0, counter = 0;

    for(i = 0; i < c.length; i++) {
        counter = 0;
        for(j = 0; j < c.length; j++) {
            if(c[j] == c[i]) {
                counter++;
            }
        }
    }
    System.out.println("The letter " + c[j] + " appears " + counter + " times");
}

public static void main(String args[]) {
    String s = "abaababcdelkm";
    solution(s);
}

5 个答案:

答案 0 :(得分:6)

您正在完成的循环之外访问c[j]:其值等于c.length,这不是正确的索引。

您需要将println语句向上移动一行并将c[j]更改为c[i]

我将使用Stream API重写它:

s.chars()
 .mapToObj(c -> (char)c)
 .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
 .forEach((k, v) -> System.out.format("The letter %c appears %d times\n", k, v));

答案 1 :(得分:1)

完成内部循环后,j等于c的长度。因此,当您在外部循环之后调用c[j]时,会收到此错误。 要解决此问题,您可以删除print,然后调用另一张打印纸以获得正确的结果。虽然,您将获得每个重复字符的重复打印。如果要防止这种情况,可以将结果添加到哈希图中。

答案 2 :(得分:1)

public static void solution(String s)
{

    char[] c = s.toCharArray();
    ArrayList<Character> countedChars = new ArrayList<Character>();
    int j = 0, i = 0, counter = 0;

    for (i = 0; i < c.length; i++)
    {
        if(countedChars.contains(c[i])){
            continue;
        }
        counter = 0;
        for (j = 0; j < c.length; j++)
        {
            if (c[j] == c[i])
            {
                counter++;
            }
        }
        countedChars.add(c[i]);
        System.out.println("The letter " + c[i] + " appears " + counter + " times");
    }
}

public static void main(String args[])
{
    String s = "abaababcdelkm";
    solution(s);
}

这会做得更好,但是如果您检查已经计算过的字母,那么就更好了。

编辑:添加了我的意思的简单示例

答案 3 :(得分:1)

如果正确使用Collections.frequency(),则不必计算每个字符。
只需创建2个列表:第一个包含字符串的所有字符,第二个包含字符串的所有不同字符:

public static void solution(String s) {
    ArrayList<Character> list = new ArrayList<Character>();
    ArrayList<Character> listDistinct = new ArrayList<Character>();

    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);

        list.add(c);

        if (!listDistinct.contains(c))
            listDistinct.add(c);
    }

    for (char c : listDistinct) {
        int freq = Collections.frequency(list, c);
        System.out.println("The letter " + c + " appears " + freq + " times");
    }
}

答案 4 :(得分:0)

您有多个错误:

  • 您的sysout应该进入您的第一个for循环
  • 在打印计数器时搜索索引13,该索引不存在。
  • ...

我建议您使用此How to count frequency of characters in a string?

这是您的代码:

    public static void solution(String s) {

    HashMap<Character, Integer> map = new HashMap<Character, Integer>();

    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        Integer val = map.get(c);
        if (val != null) {
            map.put(c, new Integer(val + 1));
        }
        else {
           map.put(c, 1);
       }
    }
    System.out.println(map.toString());

}

public static void main(String args[]) {
    String s = "abaababcdelkm";
    solution(s);
}