Как отобразить частоту каждой буквы в строке? - PullRequest
0 голосов
/ 22 октября 2018

Я хочу, чтобы мой код отображал частоту каждой буквы, но вместо этого я получаю 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 голосов
/ 22 октября 2018

Если вы используете 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");
    }
}
0 голосов
/ 22 октября 2018

У вас есть несколько ошибок:

  • Ваш sysout должен войти в ваш первый цикл for
  • Вы ищете индекс 13 при печати счетчика, которого не существует.
  • ...

Я бы посоветовал вам использовать это Как рассчитать частоту символов в строке?

Вот ваш код:

    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);
}
0 голосов
/ 22 октября 2018

Вы получаете доступ к 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));
0 голосов
/ 22 октября 2018
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);
}

Это будет намного лучше, но было бы еще лучше, если вы проверите, какие буквы вы уже посчитали, чтобы они не учитывались несколько раз

РЕДАКТИРОВАТЬ: Добавлен простой примерчто я имею в виду

0 голосов
/ 22 октября 2018

После завершения внутреннего цикла, j равно длине c.Следовательно, когда вы вызываете c[j] после внешнего цикла, вы получаете эту ошибку.Чтобы исправить это, вы можете удалить print и вызвать другую печать, чтобы получить правильный результат.Хотя вы получите повторяющуюся печать для каждого повторяющегося символа.Если вы хотите предотвратить это, вы можете добавить свой результат в хэш-карту.

...