使用Java中的数组计算字母频率

时间:2019-10-31 23:02:21

标签: java arrays

我有一个作业,在其中我通过遍历字符串中的字符来执行字母频率分析。

我不确定如何使用数组来存储每个字母的频率。数组必须按字母顺序排列,并且还必须存储非字母字符(包括空格)

不幸的是,我必须使用数组来存储频率。

用Java完成此任务的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

使用流的最有效方式

Map<Character, Long> freq = Arrays.stream(arr).
                collect(Collectors.groupingBy(Character::charValue, Collectors.counting()));

答案 1 :(得分:-1)

直接方法是使用2个数组,一个数组用于存储出现在字符串中且区分大小写的字符,另一个数组用于存储其对应的频率。

两个数组都以字符串长度的大小声明,下面的示例代码显示了如何仅使用数组和简单逻辑来实现所需的内容。

示例代码

String str = "The array must be in alphabetical order and also store non-alphabetical characters (including spaces)";

char[] charArr = new char[str.length()];
int[] freqArr = new int[str.length()];
int idx = 0;
for (int i = 0; i < str.length(); i++) {
    char c = str.charAt(i);
    boolean isFound = false;
    for (idx = 0; idx < str.length(); idx++) {
        if (freqArr[idx] == 0) {
            break;
        }
        if (c == charArr[idx]) {
            freqArr[idx]++;
            isFound = true;
            break;
        }
    }
    if (!isFound) {
        charArr[idx] = c;
        freqArr[idx]++;
    }
}

//Sort charArr and freqArr arrays
char tempChar;
int tempFreq;
for (int i = 1; i < str.length(); i++) {
    for (int j = i; j > 0; j--) {
        if (charArr[j] < charArr [j - 1]) {
            tempChar = charArr[j];
            charArr[j] = charArr[j - 1];
            charArr[j - 1] = tempChar;

            tempFreq = freqArr[j];
            freqArr[j] = freqArr[j - 1];
            freqArr[j - 1] = tempFreq;
         }
    }
}

打印字母频率

for (int i = 0; i < str.length(); i++) {
    if (freqArr[i] != 0) {
        System.out.printf("%s:%d", charArr[i], freqArr[i]);
        System.out.println();
    }
}

控制台输出

  

[:13],[(:1],[):1],[-:1],[T:1],[a:13],[b:3],[c:6], [d:3],[e:8],...