String N-Gramme mit Stream erstellen

Diskutiere String N-Gramme mit Stream erstellen im Java Basics - Anfänger-Themen Bereich.
N

Noccctis

Yoo,

ich will eine Methode schreiben, der ich ein String und ein n übergebe, sodass es n-Gramme aus diesem String erstellt und diese in einer Liste zurückgibt.

Beispiel:

Input: String= "Hallo Berlin, int n= 5

Output: {"Hallo", "allo ", "llo B", "lo Be", "o Ber", " Berl", "Berlin"}

ABER! in Form eines Streams. Ohne Stream habe ich es schon gelöst (s.Code), aber ich muss es als Stream formulieren.

Leider fällt mir keine Möglichkeit ein

Habt ihr vielleicht Ideen?

Viele Grüße,

Noctis

Java:
    public static List<String> nGramm(String s, int n) {
        s = s.trim();
        s = s.replaceAll("\\s+"," ");
        if(n>s.length()) {
            return null;
        }

        String finalS = s;
        String finalS1 = s;

        List<String> newl = new ArrayList<String>();

        for(int i = 0; i< finalS.length()-n+1; i++) {
            newl.add(finalS1.substring(i,n+i));
        }
       
        return newl;

    }
 
H

httpdigest

Mein Vorschlag wäre: Überlege dir mal, wie du eine rekursive Lösung schreiben würdest. Der nächste String in der Ergebnisliste ist ja immer einen Character weiter als der vorherige String. Und alle Strings in der Ergebnisliste sind gleichlang. Und das Ganze geht soweit, bis du am Ende des Eingabestrings angekommen bist. Wenn du eine rekursive Lösung hast, ist es sehr leicht, das in eine rekursive Methode mit Streams zu übersetzen.
 
N

Noccctis

Mein Vorschlag wäre: Überlege dir mal, wie du eine rekursive Lösung schreiben würdest. Der nächste String in der Ergebnisliste ist ja immer einen Character weiter als der vorherige String. Und alle Strings in der Ergebnisliste sind gleichlang. Und das Ganze geht soweit, bis du am Ende des Eingabestrings angekommen bist. Wenn du eine rekursive Lösung hast, ist es sehr leicht, das in eine rekursive Methode mit Streams zu übersetzen.
Das Problem ist, dass ich die Syntax und generell das System eines Streams nicht ganz verstehe. Denke eine rekursive Lösung würde mir da auch nicht weiterhelfen
 
H

httpdigest

Dann mache erstmal eine rekursive Lösung mit Listen. Ist dasselbe.
EDIT: Grundsätzliche Idee: Alle n-Gramme eines Strings `s` sind das eine n-Gramm des Strings `s` an Position 0 konkateniert mit allen n-Grammen des Strings `s` ohne das erste Zeichen.
 
N

Noccctis

Schau Dir mal IntStream als Ersatz für die for-Schleife an.
Nice das hat geklappt! Aber gibt es eine Möglichkeit direkt den Stream zu returnen, dass das erstellen der Liste, des Streams und der return (s. Anhang) in
einer Streamabfolge passieren?

Code:
        List<String> newl = new ArrayList<String>();
        
        IntStream.range(0,finalS.length()-n+1).forEach(k-> {
            newl.add(finalS1.substring(k,n+k));
        });
        
        return newl;
 
MoxxiManagarm

MoxxiManagarm

Du musst k mappen.

Java:
String s = "Hallo Berlin";
int n = 5;

List<String> subs = IntStream.rangeClosed(0, s.length() - n)
        .mapToObj(k -> s.substring(k, n + k))
        .collect(Collectors.toList());

System.out.println(subs);
 
Thema: 

String N-Gramme mit Stream erstellen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben