Häufigkeit von Wörtern zählen

Mariexshhx

Bekanntes Mitglied
Java:
public class WortHaufigkeit {
    public static void main(String[] args) {
        if (args.length != 1) {
            System.out.println("Requires exactly one filename");
            System.exit(-1);
        }
        Path file = Path.of(args[0]);

        Map<String, Long> frequency = new HashMap<>();

        try (Stream<String> words = new Scanner(file).tokens()) {

            /* frequency =  mit Hilfe von Streams implementieren */

        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(frequency);
    }
}

Hey ich soll mithilfe von Streams die Häufigkeit der einzelnen Wörter zählen ... Ich könnte doch group by nutzen und nach den einzelnen Wörtern gruppieren oder bin ich auf einem ganz falschen weg ? Und dann sozusagen Zählen wie viele Wörter eine Gruppe enthält ?
 
@Mariexshhx :

Java:
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class WordCounter {
    public static void main(String[] args) {
        List<String> words = List.of("a", "b", "a", "b", "c", "a", "c", "c", "c");
        LinkedHashMap<String, Long> linkedHashMap = words.stream()
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
                .entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())).collect(Collectors.toMap(
                        Map.Entry::getKey,
                        Map.Entry::getValue,
                        (v1, v2) -> {
                            throw new IllegalStateException();
                        },
                        LinkedHashMap::new
                ));
        System.out.println("linkedHashMap = " + linkedHashMap);
    }
}

In Zeile 13 bis 20 geht es nur darum, den Spaß zu sortieren. Die eigentliche Logik findet in Zeile 12 statt ( .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))).

Siehe auch hier https://stackoverflow.com/a/29122395 ...
 
Und ja .... ich bin nicht gut darin, mir schöne Beispielwörter zu überlegen 😉 ...
Wozu überlegen?

Java:
Stream<String> getWords() {
    HttpClient client = HttpClient.newBuilder().build();
    HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://loremipsum.de/downloads/version1.txt"))
            .GET().build();
    try {
        HttpResponse<Stream<String>> response = client.send(request, HttpResponse.BodyHandlers.ofLines());
        return response.body()
                .map(line -> line.replaceAll("[.,]", ""))
                .flatMap(line -> Stream.of(line.split("\\s")));
    } catch (IOException | InterruptedException ex) {
        throw new RuntimeException(ex);
    }
}
 
@mihe7 Wenn man Wörter oder Passwörter braucht, bietet es sich auch immer an, zufällige Wikipedia-Artikel zu crawlen und parsen. 😉

Weiß gar nicht, ob das erlaubt ist. 👀 Btw. hier ging es doch nur um ein einfaches Beispiel...
 

Zurück
Oben