Re: generator sequencial strings
Aryeh M. Friedman wrote:
After some trial and error and using the ideas from people posted here
I came up with a non-recursive one string per call solution (one small
annoyance [not critical] is if str.length>1 and str[str.length-1]>'y'
then str[str.length-2]++ when it should happen on z):
I still think the recursive approach with a class going in is
best. See WGenFlex below.
But yes a non recursive version can be made. Also that produces
the exact same output. See WGenNonRec below.
Arne
===========================================
package october;
public class WGenFlex {
public interface WGenProcesser {
public void process(String w);
}
private static void gen(char[] c, int ix, int n, char[] base,
WGenProcesser p) {
if(ix < n) {
for(int i = 0; i < base.length; i++) {
c[ix] = base[i];
gen(c, ix+1, n, base, p);
}
} else {
p.process(new String(c));
}
}
private static void gen(int n, char[] base, WGenProcesser p) {
char[] c = new char[n];
gen(c, 0, n, base, p);
}
public static void gen(int n1, int n2, char[] base, WGenProcesser p) {
for(int i = n1; i <= n2; i++) {
gen(i, base, p);
}
}
public static void main(String[] args) {
gen(1, 2, "abcdefghijklmnopqrstuvwxyz".toCharArray(),
new WGenProcesser() {
public void process(String s) {
System.out.println(s);
}
});
}
}
package october;
public class WGenNonRec {
private int n;
private char first;
private char last;
private char[] c;
public WGenNonRec(int n, char first, char last) {
this.n = n;
this.first = first;
this.last = last;
c = new char[n];
for(int i = 0; i < n - 1; i++) {
c[i] = first;
}
c[n-1] = (char)(first - 1);
}
public String getWord() {
int ix = n - 1;
while(ix >= 0) {
c[ix] = (char)(c[ix] + 1);
if(c[ix] > last) {
c[ix] = first;
ix--;
} else {
return new String(c);
}
}
return null;
}
private static void gen(int n1, int n2, char first, char last) {
for(int i = n1; i <= n2; i++) {
String w;
WGenNonRec g = new WGenNonRec(i, 'a', 'z');
while((w = g.getWord()) != null) {
System.out.println(w);
}
}
}
public static void main(String[] args) {
gen(1, 2, 'a', 'z');
}
}