[java]組み合わせ 2009/02/10

組み合わせを出力したかったので、ためしてみた。
データ構造としてスタックって重要なんだなぁと。

結果

[T, 0, A]
[T, 0, B]
[T, 1, A]
[T, 1, B]
[F, 0, A]
[F, 0, B]
[F, 1, A]
[F, 1, B]


コード
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class TestFlag2 {

public static void main(String[] args) {
b();
}

/**
* お手軽スタック
*
* @author nakawaka
*
*/
static class Stack {

Object[] objects;
int pos = 0;

public Stack(int depth) {
this.objects = new Object[depth];
}

public void push(Object o) {
objects[pos++] = o;
}

public Object pop() {
return objects[--pos];
}

public Object[] toArray(){
Object[] dest = new Object[pos];
System.arraycopy(objects, 0, dest, 0, pos);
return dest;
}
}

static void b() {

List list1 = Arrays.asList(new String[] { "T", "F"});
List list2 = Arrays.asList(new String[] { "0", "1" });
List list3 = Arrays.asList(new String[] { "A", "B" });
List list4 = Arrays.asList(new String[] { "W", "X", "Y", "Z" });

List result = comb(list1, list2, list3);

for (Object o : result) {
System.out.println(o);
}
}

/**
* <p>
* 組み合わせます。
* </p>
*
* @param lists
* @return
*/
static List<String> comb(List<String>... lists) {
List result = new ArrayList();
comb(lists, /* はじめは0スタートで */0, new Stack(lists.length), result);
return result;
}

static void comb(List[] lists, int pos, Stack stack,
List result) {

if (!(pos < lists.length))
return;

List list = lists[pos];
for (Object s : list) {
stack.push(s);
comb(lists, /* 一つ進める */pos + 1, stack, result);
// 尻尾なら結果として登録
if (pos == lists.length - 1) {
// System.out.println(stack);
result.add(Arrays.asList(stack.toArray()));
}
stack.pop();
}
return;
}
}

: