wagashi1349のブログ

気になったことを色々と

Javaで組み合わせ(Combination)

用意されてる言語もあるけど、これくらい書けたほうがいいよねってことでメモがてら。
組み合わせの場合は同じ要素を見なくて良いので、再帰で渡してるindexを+1してる。
第二引数に1以下を渡すとバグるけど無視でw

実行結果
[[a, b, c], [a, b, d], [a, c, d], [b, c, d]]

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;

public class Test {
    public static void main(String[] args) {
        List list = new ArrayList<String>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        List ret = combination(list, 3);
        System.out.println(ret);
    }

    public static List<List<String>> combination(List list, int count) {
        List ret = new ArrayList<List<String>>();
        for (int i = 0; i < list.size(); i++) {
            if (i + count > list.size()) {
                break;
            }
            Stack stack = new Stack<String>();
            stack.push(list.get(i));
            _combination(ret, list, stack, i + 1, count);
        }
        return ret;
    }

    private static void _combination(List ret, List list, Stack stack, int index, int count) {
        for (int i = index; i < list.size(); i++) {
            stack.push(list.get(i));
            if (stack.size() == count) {
                ret.add(Arrays.asList(stack.toArray()));
                stack.pop();
                continue;
            }
            _combination(ret, list, stack, i + 1, count);
            stack.pop();
        }
    }
}