ライフログもどき

youtubeのリンクを張って言いたいことをわーわー言うだけのブログ。あと日報。

Javaでペア組み合わせを列挙するプログラム

4人だったら
(1,2)(3,4)
(1,3)(2,4)
(1,4)(2,3)
みたいな感じにペアの組み合わせを列挙してくれるプログラムが欲しくてググったけどめぼしいのが見当たらなかったので自分で書いた。
なんかArrayList使いすぎて汚いけど動けばいいやってことで。

 
import java.util.ArrayList;

public class PairEnumerate {
	
	public static void main(String[] args){
		int elenum = 8;
		ArrayList<Integer> elementlist = new ArrayList<Integer>();
		for(int i = 1; i <= elenum; i++){
			elementlist.add(i);
		}
		ArrayList<ArrayList<Integer>> retarray = new ArrayList<ArrayList<Integer>>();
		retarray = enumrate(elementlist);
		for(int i = 0; i < retarray.size(); i++){
			ArrayList<Integer> temparray = new ArrayList<Integer>();
			temparray = retarray.get(i);
			System.out.print((i+1) + ":  ");
			for(int j = 0; j < temparray.size()/2; j++){
				System.out.print("(" + temparray.get(j*2) + "," + temparray.get(j*2+1) + ")  ");
			}
			System.out.println();
		}
	}
	

	
	public static ArrayList<ArrayList<Integer>> enumrate(ArrayList<Integer> argarray){
		ArrayList<ArrayList<Integer>> retval = new ArrayList<ArrayList<Integer>>();
		int top = argarray.get(0);
		argarray.remove(0);
		int tempsize = argarray.size();
		for(int i = 0; i < tempsize; i++){
			ArrayList<Integer> restarray = new ArrayList<Integer>();
			for(int j = 0; j < tempsize; j++){
				if(i != j){
					restarray.add(argarray.get(j));
				}
			}
			if(restarray.size() != 0){
				ArrayList<ArrayList<Integer>> reflexive = new ArrayList<ArrayList<Integer>>();
				reflexive = enumrate(restarray);
				for(int j=0; j < reflexive.size(); j++){
					ArrayList<Integer> tempval = new ArrayList<Integer>();
					tempval.add(top);
					tempval.add(argarray.get(i));
					tempval.addAll(reflexive.get(j));
					retval.add(tempval);
				}
			}else{
				ArrayList<Integer> tempval = new ArrayList<Integer>();
				tempval.add(top);
				tempval.add(argarray.get(i));
				retval.add(tempval);
			}
		}
		return retval;
	}

}
 


ちなみに当たり前だけど組み合わせの数は
 \frac{{}_n\mathrm{C}_2 \times  {}_{n-2}\mathrm{C}_2 \times \dots \times  {}_4\mathrm{C}_2 \times {}_2\mathrm{C}_2}{(n/2)!}
で求められる。10分以上思い出せなかった。脳年齢ヤバい。