Home > Net >  Create HashMap where key equals most frequent first letter in a text, and value is a linked list of
Create HashMap where key equals most frequent first letter in a text, and value is a linked list of

Time:12-17

It is a homework I admit. But it's to hard for me, I need some suggestions please. Method getWordsInLyrics() splits the text to words. Now how to get the most frequent first letter, and the words starting at that letter ? Store it in HashMap<String letter, LinkedList<String words >> wordBegins = new HashMap<>(); Must I use the 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<>();
    }
}

CodePudding user response:

public static void main(String[] args) {

        HashMap<String, LinkedList<String>> wordBegins = new HashMap<>();
        String[] arr = getWordsInLyrics();

        for (int i = 0; i < arr.length; i  ) {
            String firstLetter = arr[i].substring(0, 1);

            if (!wordBegins.containsKey(firstLetter)) {
                wordBegins.put(firstLetter, new LinkedList<String> () );
            }
            wordBegins.get(firstLetter).add(arr[i]);
        }
        System.out.println(wordBegins);
        }
    }

Any hint to modify, so the print returns only words starting at the letter that occures the most ?

CodePudding user response:

The most frequent character and its frequency can be easily tracked while populating the map, then appropriate word list is retrieved after the loop:

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));

Output:

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]

If uppercase and lowercase letters are counted separately without applying Character.toLowerCase:

char letter = word.charAt(0);

then the champion is:

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]

Top 10 most frequent first letters may be output using Stream API to sort the entries in the map by the size of the lists:

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()));

Output (case-insensitive check):

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