import java.util.ArrayList; 

import java.util.HashSet; 

import java.util.Iterator; 



//计算组合的算法 


public class CombinationClass { 


 public CombinationClass() 

 { 


 } 

 //对于任意n选m个元素,如果m==0,则此次排法结束,如果m不为0,那么在n个元素中选择m个元素就是要首先在n个元素中选出一个元素,然后 

 //在其他n-1个元素中选择m-1个元素。因此,对于每一个n来讲,它的任务就是,将当前传入的集合中填充上自己的信息,然后比较是否有其他 

 //集合与自己所在集合相等如果这个集合长度为0,则重新建立一个集合,然后再把集合传入到其他的数据中。 


 public ArrayList<HashSet> computeCombine(int cardinalNum, int ordinalNum,int[] numList, HashSet resultSet,ArrayList<HashSet> resultList) 

 { 

 //拷贝副本,而不能引用原来的HashSet 

 HashSet resultSetEnter = (HashSet)resultSet.clone(); 

 //如果m==0则此次排法结束 

 if(ordinalNum == 0) 

 { //完毕一种排法,把它添加到序列中 

 resultList.add(resultSetEnter); 

 return resultList; 

 } 

 if(numList.length != cardinalNum) 

 return null; 

 int newList[] = new int[numList.length - 1]; 

 for(int i = 0; i < numList.length; i ++) 

 { 

 //每次随便在cardinalNum中取出一个数,打印出来,然后在在其余的cardinalNum-1个数中取ordinal-1次 

 //如果集合长度为0,则新建一个集合 

 HashSet resultSetCopy =(HashSet)resultSet.clone(); 

 if(resultSetCopy.size() == 0) 

 resultSetCopy = new HashSet(); 



 resultSetCopy.add(numList[i]); 


 //如果有其他集合与本集合相等,则返回 

 boolean result = false; 

 for(int k = 0; k < resultList.size(); k ++) 

 { 

 HashSet hashSet = resultList.get(k); 

 result = HashSetEqual(hashSet,resultSetCopy); 

 //如果有集合和该集合相等,则跳出循环 

 if(result == true) 

 break; 

 } 

 //如果有集合和该集合相等,则进行下一次循环 

 if(result == true) 

 continue; 

 //在该集合中添加入该元素 


 //删掉numList[i] 

 for(int j = 0;j<i;j++) 

 { 

 newList[j] = numList[j]; 

 } 

 for(int j = i + 1; j <= numList.length - 1; j ++) 

 { 

 newList[j - 1] = numList[j]; 

 } 


 computeCombine(cardinalNum - 1,ordinalNum - 1, newList,resultSetCopy, resultList); 

 } 



 return null; 

 } 


 public static boolean HashSetEqual(HashSet hashSet, HashSet resultSetCopy) 

 { int equal = 1; 

 Iterator it = hashSet.iterator(); 

 if(resultSetCopy.size() == hashSet.size()){ 

 while(it.hasNext()) 

 { 

 if(equal == 0) 

 break; 

 if(equal == 1){ 

 equal = 0; 

 int num = ((Integer)it.next()).intValue(); 

 Iterator it2 = resultSetCopy.iterator(); 

 while(it2.hasNext()) 

 { 

 int num2 = ((Integer)it2.next()).intValue(); 

 if(num == num2){ 

 equal = 1; 

 break; 

 } 

 } 

 } 

 } 

 if(equal == 1) 

 return true; 

 else 

 return false; 

 } 

 return false; 

 } 

} 



//主方法 


import java.util.ArrayList; 

import java.util.HashSet; 

import java.util.Iterator; 



public class Main { 


 /** 

 * @param args 

 */ 

 public static void main(String[] args) { 

 // TODO Auto-generated method stub 

 CombinationClass combinationClass = new CombinationClass(); 

 ArrayList<HashSet> resultList = new ArrayList<HashSet>(); 

 combinationClass.computeCombine(8, 3, new int[]{1,2,3,4,5,6,7,8},new HashSet(), resultList); 

 System.out.println("BBBBBB" + resultList.size()); 

 for(int i = 0; i < resultList.size(); i ++) 

 { 

 HashSet set = resultList.get(i); 

 Iterator it = set.iterator(); 

 while(it.hasNext()) 

 { 

 System.out.print(it.next() + " - "); 

 } 

 System.out.println(); 

 } 

 } 


}