Ich glaube, das tun würde, was Sie wollen:
import java.util.*;
public class Test {
public static List<String> ngrams(int n, String str) {
List<String> ngrams = new ArrayList<String>();
String[] words = str.split(" ");
for (int i = 0; i < words.length - n + 1; i++)
ngrams.add(concat(words, i, i+n));
return ngrams;
}
public static String concat(String[] words, int start, int end) {
StringBuilder sb = new StringBuilder();
for (int i = start; i < end; i++)
sb.append((i > start ? " " : "") + words[i]);
return sb.toString();
}
public static void main(String[] args) {
for (int n = 1; n <= 3; n++) {
for (String ngram : ngrams(n, "This is my car."))
System.out.println(ngram);
System.out.println();
}
}
}
Ausgang:
This
is
my
car.
This is
is my
my car.
This is my
is my car.
Eine "On-Demand" -Lösung als Iterator implementiert:
class NgramIterator implements Iterator<String> {
String[] words;
int pos = 0, n;
public NgramIterator(int n, String str) {
this.n = n;
words = str.split(" ");
}
public boolean hasNext() {
return pos < words.length - n + 1;
}
public String next() {
StringBuilder sb = new StringBuilder();
for (int i = pos; i < pos + n; i++)
sb.append((i > pos ? " " : "") + words[i]);
pos++;
return sb.toString();
}
public void remove() {
throw new UnsupportedOperationException();
}
}
'ngrams ("Das ist mein Auto", -3)' (sorry, konnte nicht widerstehen) – wds
'ngrams (" Das ist mein Auto ", -3)" funktioniert gut. 'ngrams (" Das ist mein Auto ", 6)' ergibt jedoch eine 'NegativeArraySizeException'. – aioobe
Was erwarten Sie in diesen Fällen? Ich würde vorschlagen, einen Test am Anfang der Methode zu setzen und ein leeres Array zurückzugeben. Im Allgemeinen sehe ich wenige SO Antworten mit einer hoch entwickelten Fehlerbehandlung. – Landei