Нужна помощь в перечислении частоты символов на основе ввода пользователя - PullRequest
0 голосов
/ 05 июля 2018

текущий код, который у меня есть, перечисляет частоту массива букв, и мне было интересно, есть ли способ включить цифры и все знаки препинания, доступные пользователю. (т.е. текст ASCII) Я ценю любую помощь!

import java.util.Scanner;

public class JavaProgram
{
public static void main(String args[])
{
   Scanner scan = new Scanner(System.in);
    int i = 0; 
    int j = 0; 
    int k = 0; 
    String str;
    char c, ch;


    System.out.print("Enter a String : ");
    str=scan.nextLine();

    i=str.length();
    for(c='A'; c<='z'; c++)
    {
        k=0;
        for(j=0; j<i; j++)
        {
            ch = str.charAt(j);
            if(ch == c)
            {
                k++;
            }
        }
        if(k>0)
        {
            System.out.println( c + "  "  + k );
        }



}
}
}

input
Enter a String : jhdvaevaecvieabvuae[;;;/'[298734327
output
[  2
a  4
b  1
c  1
d  1
e  4
h  1
i  1
j  1
u  1
v  4

Кроме того, этот код полностью готов для различения прописных и строчных букв.

Ответы [ 4 ]

0 голосов
/ 05 июля 2018

Зачем беспокоиться о такой проверке, если вы хотите поддерживать все символы на клавиатуре? (технически пользователь может вводить любые символы ASCII). Ниже приведено более простое решение, которое дает лучшую производительность по времени :

public static void main(String[] args) {
    Map<Character, Integer> rst = new HashMap<>();
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter String: ");
    String str = sc.nextLine();

    char[] charArr = str.toCharArray();

    for(int i = 0; i < charArr.length; i++){
        int cnt = rst.containsKey(charArr[i]) ? rst.get(charArr[i])+1 : 1;

        rst.put(charArr[i], cnt);
    }

    rst.entrySet().forEach(entry -> {
        System.out.println(entry.getKey() + " " + entry.getValue());
    });
}

Ниже приведен пример прогона:

Enter String: 
dfasrewrqe234342#$@#%@#$%@#$
@ 3
a 1
# 4
d 1
$ 3
e 2
% 2
f 1
q 1
r 2
2 2
s 1
3 2
4 2
w 1

Process finished with exit code 0
0 голосов
/ 05 июля 2018

Вы можете использовать следующие шаги. создать массив частот, имеющий емкость 128 (размер набора символов ascii). Инициализируйте все элементы частоты до 0. Теперь отсканируйте каждый символ входной строки и увеличьте частоту на 1 в массиве частот. Индекс массива может быть вычислен путем преобразования текущего символа в его целочисленное представление. Для справки вы можете воспользоваться кодом, указанным ниже.

public String computeFrequency(String input) {
    int []frequecy = new int[128]; // each element of array represent frequency of some character indexed by character's ascii code
    for(char ch: input.toCharArray()) {
        int intCurrentChar = (int) ch;  // get ascii code of current character. It can be obtained by casting character to integer in java.
        frequecy[intCurrentChar]++; // increase the frequency of current character
    }

    // collect all non zero frequency to string
    StringBuilder sbr = new StringBuilder();
    for(int frequencyIndex = 0; frequencyIndex <128; frequencyIndex++) {
        if( frequecy[frequencyIndex]>0) {
            char ch = (char) frequencyIndex; // get ascii character from ascii code. It can be obtained by casting integer to character in java.
            sbr.append(ch).append(" ").append(System.lineSeparator());
        }
    }

    return sbr.toString();  
}
0 голосов
/ 05 июля 2018

Это то, для чего были созданы Карты.

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    System.out.print("Enter a String : ");
    String s = scan.nextLine();

    Map<Character, Integer> frequency = new TreeMap<>();
    for (int i = 0; i < s.length(); i++) {
        Character c = s.charAt(i);
        Integer n = frequency.get(c);
        if (n == null) frequency.put(c, 1);
        else frequency.put(c, n + 1);
    }

    for (Map.Entry<Character, Integer> e : frequency.entrySet()) {
        System.out.println(e.getKey() + " " + e.getValue());
    }
}

Не забудьте импортировать java.util.Map и java.util.TreeMap.

0 голосов
/ 05 июля 2018

Используя Java 8, вы можете легко решить эту проблему с помощью stream и groupingBy следующим образом:

    import static java.util.stream.Collectors.*;

    Scanner scan = new Scanner(System.in);
    System.out.print("Enter a String : ");
    String str =scan.nextLine();
    String ret = str.chars().mapToObj(c -> (char) c).collect(groupingBy(c -> c, counting()))
            .entrySet().stream()
            .sorted(Comparator.comparing(Map.Entry::getValue))
            .map(entry -> entry.getKey() + ": " + entry.getValue())
            .collect(joining(", "));
    System.out.println(ret);

Вот демо (вход и выход):

Enter a String : scan.nextLine();
a: 1, c: 1, s: 1, t: 1, (: 1, x: 1, ): 1, i: 1, ;: 1, L: 1, .: 1, e: 2, n: 3
...