/* package whatever; // don't place package name! */
import java.util.Arrays;
import java.util.Iterator;
import java.util.NoSuchElementException;
@SuppressWarnings("javadoc")
class Combinations implements Iterable<int[]> {
private class Yielder implements Iterator<int[]> {
private final long size;
private final long limit;
private long next = 0;
private final int[] stash;
public Yielder(int size) {
super();
this.size = size;
this.limit = 1 << size;
this.stash = new int[size];
}
@Override
public boolean hasNext() {
return next < limit;
}
@Override
public int[] next() {
if (next >= limit) {
}
int count = 0;
for (int b = 0; b < size; b++) {
if ((next & (1 << b)) != 0) {
stash[count++] = b;
}
}
next++;
return Arrays.
copyOf(stash, count
); }
@Override
public void remove() {
}
}
private final int datasize;
/**
* @param datasize
*/
public Combinations(int datasize) {
super();
this.datasize = datasize;
}
@Override
public Iterator<int[]> iterator() {
return new Yielder(datasize);
}
public static void main
(String[] args
) {
String[] data
= {"a",
"b",
"c",
"d"}; int cnt = 0;
StringBuilder sb = new StringBuilder();
for (int[] combination : new Combinations(data.length)) {
sb.setLength(0);
for (int index : combination) {
sb.append(data[index]);
}
System.
out.
printf("Combination %6d size %2d members %15s %8s .%n", cnt
++, combination.
length,
Arrays.
toString(combination
), sb.
toString()); }
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwppbXBvcnQgamF2YS51dGlsLkFycmF5czsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwoKCgpAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCmNsYXNzIENvbWJpbmF0aW9ucyBpbXBsZW1lbnRzIEl0ZXJhYmxlPGludFtdPiB7CgogICAgcHJpdmF0ZSBjbGFzcyBZaWVsZGVyIGltcGxlbWVudHMgSXRlcmF0b3I8aW50W10+IHsKICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgc2l6ZTsKICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgbGltaXQ7CiAgICAgICAgcHJpdmF0ZSBsb25nIG5leHQgPSAwOwogICAgICAgIHByaXZhdGUgZmluYWwgaW50W10gc3Rhc2g7IAoKICAgICAgICBwdWJsaWMgWWllbGRlcihpbnQgc2l6ZSkgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLnNpemUgPSBzaXplOwogICAgICAgICAgICB0aGlzLmxpbWl0ID0gMSA8PCBzaXplOwogICAgICAgICAgICB0aGlzLnN0YXNoID0gbmV3IGludFtzaXplXTsKICAgICAgICB9CiAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKICAgICAgICAgICAgcmV0dXJuIG5leHQgPCBsaW1pdDsKICAgICAgICB9CiAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgcHVibGljIGludFtdIG5leHQoKSB7CiAgICAgICAgICAgIGlmIChuZXh0ID49IGxpbWl0KSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGludCBjb3VudCA9IDA7CiAgICAgICAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgc2l6ZTsgYisrKSB7CiAgICAgICAgICAgICAgICBpZiAoKG5leHQgJiAoMSA8PCBiKSkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgIHN0YXNoW2NvdW50KytdID0gYjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBuZXh0Kys7CiAgICAgICAgICAgIHJldHVybiBBcnJheXMuY29weU9mKHN0YXNoLCBjb3VudCk7CiAgICAgICAgfQogICAgICAgIEBPdmVycmlkZQogICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgICAgICAgfQogICAgICAgIAogICAgfQogICAgCiAgICBwcml2YXRlIGZpbmFsIGludCBkYXRhc2l6ZTsKICAgIAogICAgLyoqCiAgICAgKiBAcGFyYW0gZGF0YXNpemUKICAgICAqLwogICAgcHVibGljIENvbWJpbmF0aW9ucyhpbnQgZGF0YXNpemUpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuZGF0YXNpemUgPSBkYXRhc2l6ZTsKICAgIH0KCiAgICBAT3ZlcnJpZGUKICAgIHB1YmxpYyBJdGVyYXRvcjxpbnRbXT4gaXRlcmF0b3IoKSB7CiAgICAgICAgcmV0dXJuIG5ldyBZaWVsZGVyKGRhdGFzaXplKTsKICAgIH0KCgoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICAKICAgICAgICBTdHJpbmdbXSBkYXRhID0geyJhIiwgImIiLCAiYyIsICJkIn07CiAgICAgICAgaW50IGNudCA9IDA7CiAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgZm9yIChpbnRbXSBjb21iaW5hdGlvbiA6IG5ldyBDb21iaW5hdGlvbnMoZGF0YS5sZW5ndGgpKSB7CiAgICAgICAgCXNiLnNldExlbmd0aCgwKTsKICAgICAgICAJZm9yIChpbnQgaW5kZXggOiBjb21iaW5hdGlvbikgewogICAgICAgIAkJc2IuYXBwZW5kKGRhdGFbaW5kZXhdKTsKICAgICAgICAJfQogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiQ29tYmluYXRpb24gJTZkIHNpemUgJTJkIG1lbWJlcnMgJTE1cyAlOHMgLiVuIiwgY250KyssIGNvbWJpbmF0aW9uLmxlbmd0aCwgQXJyYXlzLnRvU3RyaW5nKGNvbWJpbmF0aW9uKSwgc2IudG9TdHJpbmcoKSk7CiAgICAgICAgfQogICAgICAgIAogICAgfQp9Cg==
Combination 0 size 0 members [] .
Combination 1 size 1 members [0] a .
Combination 2 size 1 members [1] b .
Combination 3 size 2 members [0, 1] ab .
Combination 4 size 1 members [2] c .
Combination 5 size 2 members [0, 2] ac .
Combination 6 size 2 members [1, 2] bc .
Combination 7 size 3 members [0, 1, 2] abc .
Combination 8 size 1 members [3] d .
Combination 9 size 2 members [0, 3] ad .
Combination 10 size 2 members [1, 3] bd .
Combination 11 size 3 members [0, 1, 3] abd .
Combination 12 size 2 members [2, 3] cd .
Combination 13 size 3 members [0, 2, 3] acd .
Combination 14 size 3 members [1, 2, 3] bcd .
Combination 15 size 4 members [0, 1, 2, 3] abcd .