Reputation: 67
I don't know why I can't work this one in my head.
I have an array of characters in my Java code..
private String[] letters = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
};
What I need to do is loop through building strings for every possible configuration.
Example:
a aa ab ac . . . aaa aab aac . . . . aba abc
and so on up to n length.
Can any one point me in the direction with this problem.
Cheers
Upvotes: 3
Views: 1202
Reputation: 6926
Recursion to the rescue!
static List<String> permutations(int len, String[] letters) {
List<String> ret = new ArrayList<String>();
if (len == 1) {
ret.addAll(Arrays.asList(letters));
} else {
List<String> perms = permutations(len - 1, letters);
for (String l : letters) {
ret.add(l);
for (String s : perms) {
ret.add(l + s);
}
}
}
return ret;
}
Update: I tweaked the code to also produce permutations of 1
to n-1
characters.
Notice that the output isn't ordered the same way as specified the by the OP. I wouldn't expect it to matter, but who knows...
Example output:
[0, 00, 000, 001, 002, 003, 004, 005, 006, 007, 008, 009, 01, 010, 011, ...]
Upvotes: 0
Reputation: 15729
Yet another recursive approach. I'm working in the other direction from @liwp. There's a slight advantage that I only allocate one output ArrayList. Also, for simplicity, I just put in the numbers 0...9 in this example
static public void combos(String[] inputs, List<String> outputs, String preface, int maxDepth) {
if (preface.length() >= maxDepth)
return;
for (String s : inputs) {
// swap the order of these two lines if you want depth first
outputs.add(preface+s);
combos(inputs, outputs, preface+s, maxDepth);
}
}
public static void main(String[] args) {
String[] numbers = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
ArrayList<String> outputs = new ArrayList<String>();
combos(numbers, outputs, "", 3);
System.out.println(outputs);
}
will print out
[0, 00, 000, 001, 002, 003, 004, 005, 006, 007, 008, 009, 01, 010, 011...
Upvotes: 2
Reputation: 333
This method appears to be able to take a set and create the combinations like you are looking for. You need to add the class to your project to be able to create a CombinationGenerator().
There doesn't appear to be only one way, but at least you would be able to copy in the method they used and call it.
String[] letters;
int[] indices;
CombinationGenerator x = new CombinationGenerator (letters.length, 3);
StringBuffer combination;
while (x.hasMore ()) {
combination = new StringBuffer ();
indices = x.getNext ();
for (int i = 0; i < indices.length; i++) {
combination.append (elements[indices[i]]);
}
System.out.println (combination.toString ());
}
Upvotes: 0
Reputation: 28713
If you don't need very long sequence you can use recursion like this:
for (String letter : letters) {
String currentSequence = start + letter;
System.out.println(currentSequence); // do something with your data here
if (depth > 0) {
printCombinations(currentSequence, depth - 1);
}
}
Upvotes: 0