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