Problem z zadaniem. Wypisanie wyrazów zaczynających się na najczęściej występującą pierwszą literę w tekście.

0

Celem mojego zadania jest sprawdzenie, na jaką literę najczęściej zaczynają się słowa w badanym tekście. Program powinien wypisać wszystkie słowa, które zaczynają się na tę literę. Metoda getWordsInLyrics() rozdziela tekst na poszczególne słowa. Jak teraz stworzyć mapę w której kluczem będzie najczęściej występująca pierwsza litera, a wartością lista łączona składająca się z wyrazów na tą literę. Proszę o pomoc, każda wskazówka lub rozwiązanie będzie cenne. Dziękuję.

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

3
        Pattern  SPLIT_REGEX = Pattern.compile("[^\\x21-\\x7E]|[\\p{Punct}]");
        final String[] split = SPLIT_REGEX.split(LYRICS);
        Stream.of(split).filter(word -> word.length() > 2)
                .collect(Collectors.groupingBy(x -> x.charAt(0)))
                .entrySet().stream()
                .max(Comparator.comparingInt(x -> x.getValue().size()))
                .ifPresent(result -> System.out.println("Start letter: "+result.getKey()+" Words: "+result.getValue()));


0

@aolo23: Dziękuję działa to świetnie ale to rozwiązanie jest z wyższej półki. Mój nauczyciel od razu powie że to nie moja praca.

0

@aolo23: !word.isEmpty() && to jest chyba nadmiarowe jak i tak sprawdzasz length?

1

@Proximo_224:

Proximo_224 napisał(a):

@aolo23: Dziękuję działa to świetnie ale to rozwiązanie jest z wyższej półki. Mój nauczyciel od razu powie że to nie moja praca.

A to dokładnie o to chodzi w podawaniu przez kolegów gotowców.

Co cię powstrzymuje przed napisaniem prostej pętli?
JEŚLI (=jeśli to ty) strukturę danych wymyśliłeś poprawnie *, by świadczyło, że rozumiesz zagadnienie

* można się doktoryzować, ja bym dał HashMap<Character, LinkedList<String>> ale jest nieźle

0

@J.Muzykant: Panie Janko może Pan rozwinie temat * tej pętli ?

    • napisze przykład dla zadania ;)
0
Proximo_224 napisał(a):

@J.Muzykant: Panie Janko może Pan rozwinie temat * tej pętli ?

Pewnie, ze mogę rozwinąć. Pętla ma swój początek, warunek kontunuowania, zakończenie.
Zwykle działa w stosunku do jakiejś struktury danych
Podczas przebiegu pętli zajmujemy się zwykle pojedynczym "atomem" danych z tej struktury

napisze przykład dla zadania ;)

Czyli szukamy frajerów?
Może głupio wyglądam, ale generalnie idiotą nie jestem

0

@J.Muzykant: Ani przez chwilę tak nie pomyślałem. Z całym szacunkiem nie chodzi mi o całe rozwiązanie zadania tylko o konkretne podpowiedzi dla żółtodzioba czyli dla mnie. Najprostsze podpowiedzi.

0
public static void main(String[] args) {

        HashMap<String, LinkedList<String>> wordBegins = new HashMap<>();

        String[] arr = getWordsInLyrics();
        for (int i = 0; i<arr.length; i++) {
                if (wordBegins.containsKey(arr[i].substring(0,1))) {
                    wordBegins.put(arr[i].substring(0,1), null);
            }
                else {
                    wordBegins.put (arr[i], null);
                }
        }
    }
1
        final Map<Character, List<String>> charOnWords = new HashMap<>();
        for (String word : split) {
            if (word.length() < 3) continue;
            final Character firstLetter = word.charAt(0);
            charOnWords.compute(firstLetter, (k, v) -> {
                if (v == null) {
                    final ArrayList<String> strings = new ArrayList<>();
                    strings.add(word);
                    return strings;
                }
                v.add(word);
                return v;
            });
        }

        Map.Entry<Character, List<String>> ref = null;
        int max = -1;
        final Set<Map.Entry<Character, List<String>>> entries = charOnWords.entrySet();
        for (Map.Entry<Character, List<String>> entry: entries){
            final int size = entry.getValue().size();
            if (size > max){
                max = size;
                ref = entry;
            }
        }

        if (ref != null){
            System.out.println("[2] Start letter: " + ref.getKey() + " Words: " + ref.getValue());
        }

Może I prościej ale czy warto? Jeśli masz problem z pętlami a rzucasz się na taką wodę

0

@aolo23:

Hmmm .... przedstawiasz się jako początkujący, a teraz jedziesz wcale skomplikowane wyrażenia lambda.

Jak osobiście bym się nie podjął, a zwłaszcza testowanie null'a w lambdach zaprzecza temu, jakie lambdy miały być: proste, jednoznaczne itd ... (takie jest moje wrażenie)
Bierzesz odpowiedzialność za te lambdy, czy skopiowałeś?

Ja sobie tak wyobrażam "po szkolnemu", w każdym miejscu można debugerem podejrzeć zmienne robocze itd

for (String word : split) {
            if (word.length() < 3) continue; /// nie wnikam, jest takie załozenie?

            final Character firstLetter = word.charAt(0);
            ArrayList<String>  list = null;
            if(wordBegins.containsKey(firstLetter ))
            {
                 list = wordBegins.get(firstLetter );
            }
            else
            {
                  list = new  ArrayList<String>();
                  wordBegins.put(firstLetter , list);
            }
 
           list.Add(word);
        }

teraz wniosę dyskusję: lista słów, czy unikalnych słów?
Pewnie jakieś toupper ?

Stosownie do celu List<String> zmieniamy na Set<String> (dla unikalnych)
Wybranie List i kombinowanie z entry set itd ... oceniam jako sztuczne i nieekonomiczne

0

@aolo23:

jeśli błaganie o prościutką szkolną pętlę (na 5 minut) nie jest podawaniem się za początkującego (i czekanie wiele godzin na poradę)...

1 użytkowników online, w tym zalogowanych: 0, gości: 1