Как мы можем рассчитать частоту символов в строке - PullRequest
0 голосов
/ 27 февраля 2019

Я искал решение проблемы.

    static void printCharWithFreq(String str) 
{ 
     // size of the string 'str' 
    int n = str.length(); 

    // 'freq[]' implemented as hash table 
    int[] freq = new int[SIZE]; 

    // accumulate freqeuncy of each character 
    // in 'str' 
    for (int i = 0; i < n; i++) 
        freq[str.charAt(i) - 'a']++; 

    // traverse 'str' from left to right 
    for (int i = 0; i < n; i++) { 

        // if frequency of character str.charAt(i) 
        // is not equal to 0 
        if (freq[str.charAt(i) - 'a'] != 0) { 

            // print the character along with its 
            // frequency 
            System.out.print(str.charAt(i)); 
            System.out.print(freq[str.charAt(i) - 'a'] + " ");  

            // update frequency of str.charAt(i) to  
            // 0 so that the same character is not 
            // printed again 
            freq[str.charAt(i) - 'a'] = 0; 
        } 
    } 
} 

Я не могу понять, как

for (int i = 0; i < n; i++) 
        freq[str.charAt(i) - 'a']++; 

может рассчитать частоту элементов.и как оно хранится обратно в позицию.

Я запутался с этим.Может кто-нибудь помочь мне с этим?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Мне кажется, что вы могли бы переписать свое решение намного проще.Если только я не пойму это неправильно, решение будет гораздо более сложным, чем нужно.

s.chars().mapToObj(c -> (char) c).collect(Collectors.groupingBy(c -> c, Collectors.counting()));

Что касается частоты, то символы в Java поддерживаются кодами ASCII.Таким образом, вы можете вычесть символы друг от друга, чтобы получить значения ASCII.Спасибо @BackSlash за реализацию потока.

0 голосов
/ 27 февраля 2019

Буквы ASCII в нижнем регистре занимают непрерывную часть таблицы ASCII , начиная с индекса 97 до 122. Если ваш ввод состоит из букв ASCII в нижнем регистре, выражение str.charAt(i) - 'a' будет преобразовано в значения из диапазона [0, 25] .a станет 0, b станет 1, c станет 2 и т. Д.

Однако этот подход не подходит для строчных символов ASCII, например, заглавная буква 'A' имеет значение 65,'A' - 'a' будет 65 - 97, пытаясь получить доступ к отрицательному индексу массива.

...