最後に、このタスクを完了するには常に n + 1 文字列が必要です。最適化できるのは、それらのオブジェクトが作成される時間だけです。
文字列表現を char 配列として作成し、lazy (オンデマンド) でサフィックスを返すことができます。
これを行うには、 Iterable および Iterator インターフェースを使用できます。
public class StringSufixies implements Iterable<String> {
private final String input;
public StringSufixies(String input) {
this.input = input;
}
@Override
public Iterator<String> iterator() {
return new SuffixStringIterator(input);
}
private static class SuffixStringIterator implements Iterator<String> {
private final String input;
private final int size;
private int suffixId;
private SuffixStringIterator(String input) {
this.input = input;
this.size = input.length();
this.suffixId = 1;
}
@Override
public boolean hasNext() {
return suffixId <= size;
}
@Override
public String next() {
return input.substring(0, suffixId++); //At this point we create new String
}
@Override
public void remove() {
//Add throw or other impl
}
}
}
主要な機能を char 配列に実装できます。
private static class SuffixCharIterator implements Iterator<String> {
private final char[] charSequence;
private final int size;
private int suffixId = 0;
private SuffixCharIterator(char[] charSequence) {
this.charSequence = charSequence;
this.size = charSequence.length;
}
@Override
public boolean hasNext() {
return suffixId <= size;
}
@Override
public String next() {
return new String(charSequence, 0, suffixId++); //At this point we create a new String
}
@Override
public void remove() {
}
}
しかし、私見はもっと複雑で、何も得られません。
このソリューションの利点は、結果に取り組み、すべてのプレフィックスが作成される前に停止することを決定できることです。