创建 HashMap,其中键等于文本中出现频率最高的第一个字母,值是所有以该字母开头的单词的链表

Create HashMap where key equals most frequent first letter in a text, and value is a linked list of all words starting on that letter

这是我承认的作业。但这对我来说很难,我需要一些建议。方法 getWordsInLyrics() 将文本拆分为单词。现在如何获得最常见的第一个字母,以及以该字母开头的单词?存储在 HashMap<String letter, LinkedList<String words >> wordBegins = new HashMap<>(); 我必须使用 charAt(0) 吗?

import java.util.HashMap;
import java.util.LinkedList;

public class LyricsCounter {

    private static final String LYRICS = "Dwunastu braci, wierzac w sny, zbadalo mur od marzen strony,\n" +
            "A poza murem plakal glos, dziewczecy glos zaprzepaszczony.\n" +
            "I pokochali glosu dzwiek i chetny domysl o Dziewczynie,\n" +
            "I zgadywali ksztalty ust po tym, jak spiew od zalu ginie...\n" +
            "Mowili o niej: \"lka, wiec jest!\" - I nic innego nie mowili,\n" +
            "I przezegnali caly swiat - i swiat zadumal sie w tej chwili...\n" +
            "Porwali mloty w twarda dlon i jeli w mury tluc z loskotem!\n" +
            "I nie wiedziala slepa noc, kto jest czlowiekiem, a kto mlotem?\n" +
            "\"O, predzej skruszmy zimny glaz, nim smierc Dziewczyne rdza powlecze!\" -\n" +
            "Tak, walac w mur, dwunasty brat do jedenastu innych rzecze.\n" +
            "Ale daremny byl ich trud, daremny ramion sprzeg i usil!\n" +
            "Oddali ciala swe na strwon owemu snowi, co ich kusil!\n" +
            "lamia sie piersi, trzeszczy kosc, prochnieja dlonie, twarze bledna...\n" +
            "I wszyscy w jednym zmarli dniu i noc wieczysta mieli jedna!\n" +
            "Lecz cienie zmarlych - Boze moj! - nie wypuscily mlotow z dloni!\n" +
            "I tylko inny plynie czas - i tylko mlot inaczej dzwoni...\n" +
            "I dzwoni w przod! I dzwoni wspak! I wzwyz za kazdym grzmi nawrotem!\n" +
            "I nie wiedziala slepa noc, kto tu jest cieniem, a kto mlotem?\n" +
            "\"O, predzej skruszmy zimny glaz, nim smierc Dziewczyne rdza powlecze!\" -\n" +
            "Tak, walac w mur, dwunasty cien do jedenastu innych rzecze.\n" +
            "Lecz cieniom zbraklo nagle sil, a cien sie mrokom nie opiera!\n" +
            "I powymarly jeszcze raz, bo nigdy dosc sie nie umiera...\n" +
            "I nigdy dosc, i nigdy tak, jak pragnie tego ow, co kona!...\n" +
            "I znikla tresc - i zginal slad - i powiesc o nich juz skonczona!\n" +
            "Lecz dzielne mloty - Boze moj - mdlej nie poddaly sie zalobie!\n" +
            "I same przez sie bily w mur, huczaly spizem same w sobie!\n" +
            "Huczaly w mrok, huczaly w blask i ociekaly ludzkim potem!\n" +
            "I nie wiedziala slepa noc, czym bywa mlot, gdy nie jest mlotem?\n" +
            "\"O, predzej skruszmy zimny glaz, nim smierc Dziewczyne rdza powlecze!\" -\n" +
            "Tak, walac w mur, dwunasty mlot do jedenastu innych rzecze.\n" +
            "I runal mur, tysiacem ech wstrzasajac wzgorza i doliny!\n" +
            "Lecz poza murem - nic i nic! Ni zywej duszy, ni Dziewczyny!\n" +
            "Niczyich oczu ani ust! I niczyjego w kwiatach losu!\n" +
            "Bo to byl glos i tylko - glos, i nic nie bylo oprocz glosu!\n" +
            "Nic - tylko placz i zal i mrok i niewiadomosc i zatrata!\n" +
            "Takiz to swiat! Niedobry swiat! Czemuz innego nie ma swiata?\n" +
            "Wobec klamliwych jawnie snow, wobec zmarnialych w nicosc cudow,\n" +
            "Potezne mloty legly w rzad, na znak spelnionych godnie trudow.\n" +
            "I byla zgroza naglych cisz. I byla proznia w calym niebie!\n" +
            "A ty z tej prozni czemu drwisz, kiedy ta proznia nie drwi z ciebie?";

    private static String[] getWordsInLyrics() {
        return LYRICS.split("\W+");
    }

    public static void main(String[] args) {
        HashMap<String, LinkedList<String>> wordBegins = new HashMap<>();
    }
}

填充地图时可以轻松跟踪最频繁出现的字符及其频率,然后在循环后检索适当的单词列表:

Map<Character, LinkedList<String>> map = new HashMap<>();
char maxChar = ' ';
int maxFreq = 0;
for (String word : LYRICS.split("\W+")) {
    char letter = Character.toLowerCase(word.charAt(0));
    map.computeIfAbsent(letter, k -> new LinkedList<>()).add(word);
    int freq = map.get(letter).size();
    if (maxFreq < freq) {
        maxFreq = freq;
        maxChar = letter;
    }
}
System.out.println("Most frequent: " + maxChar + "; frequency = " + maxFreq);
System.out.println(map.get(maxChar));

输出:

Most frequent: i; frequency = 47
[I, i, I, I, innego, I, i, i, I, innych, ich, i, ich, I, i, I, inny, i, inaczej, I, I, I, I, innych, I, I, i, I, i, i, I, i, I, innych, I, i, i, I, i, i, i, i, i, i, innego, I, I]

如果大写字母和小写字母分开计算而不应用Character.toLowerCase:

char letter = word.charAt(0);

那么冠军是:

Most frequent: n; frequency = 38
[niej, nic, nie, nie, noc, nim, na, noc, nie, nawrotem, nie, noc, nim, nagle, nie, nigdy, nie, nigdy, nigdy, nich, nie, nie, noc, nie, nim, nic, nic, ni, niczyjego, nic, nie, niewiadomosc, nie, nicosc, na, naglych, niebie, nie]

可以使用 Stream API 输出前 10 个最常见的首字母,以按列表的大小对映射中的条目进行排序:

final int mx = maxFreq;
map.entrySet().stream()
    .sorted(Comparator.<Map.Entry<Character, LinkedList<String>>>comparingInt(e -> e.getValue().size())
        .reversed()
        .thenComparing(Map.Entry.comparingByKey())
    )
    .limit(10)
    .forEach(e -> System.out.println(e.getKey() + " = " + e.getValue().size()));

输出(不区分大小写的检查):

i = 47
n = 42
s = 36
w = 34
d = 31
m = 30
p = 28
t = 26
z = 25
c = 20