输出全排列

给定一组对象,要求给出这些对象数据的全排列。 例子: 对象数据{A}, 全排列 [A] 对象数据 {A,B} 全排列 [AB] [BA] 对象数据 {A,B,C}全排列 [ABC][ACB][BAC][BCA][CAB][CBA] ... 依此类推 根据对象数据的个数,得到的全排列个数为 Num = N! (N为对象数据的个数)本例子采用递归方式来实现。本例子中没有考虑当出现相同数据时,产生相同的组合,如果需要保持每个组合的唯一性,可以将得到的组合放置到一个结果List中,然后通过contains(Object o)方法判断需要不需要加入到结果链表中就好了 


代码: 

Java代码   收藏代码
  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3.   
  4. /** 
  5.  * 题目: 给定一组对象,要求给出这些对象数据的全排列。 例子: 对象数据{A}, 全排列 [A] 对象数据 {A,B} 全排列 [AB] [BA] 对象数据 
  6.  * {A,B,C}全排列 [ABC][ACB][BAC][BCA][CAB][CBA] ... 依此类推 根据对象数据的个数, 得到的全排列个数为 Num = 
  7.  * N! (N为对象数据的个数) 
  8.  *  
  9.  * 本例子采用递归方式来实现。 
  10.  * 本例子中没有考虑当出现相同数据时,产生相同的组合, 
  11.  * 如果需要保持每个组合的唯一性,可以将得到的组合放置到一个结果List中, 
  12.  * 然后通过contains(Object o)方法判断需要不需要加入到结果链表中就好了 
  13.  *  
  14.  * @author Eric Wang 
  15.  * @version 1.0 
  16.  *  
  17.  */  
  18. public class Permutation {  
  19.   
  20.  private static final String EMPTY = "";  
  21.   
  22.  // 通过列表来存放样本数据  
  23.  private static List<String> sampleData = new ArrayList<String>();  
  24.  static {  
  25.   // 初始化sampleData的值  
  26.   sampleData.add("A");  
  27.   sampleData.add("B");  
  28.   sampleData.add("C");  
  29.   sampleData.add("D");  
  30.   sampleData.add("E");  
  31.  }  
  32.  //统计个数  
  33.  private int currentCount = 1;  
  34.   
  35.  /** 
  36.   *  
  37.   * @param remainingData : 
  38.   *            剩余的需要递归的数据 
  39.   * @param currentData : 
  40.   *            目前得到的数据 
  41.   */  
  42.  public void getPermutation(List<String> remainingData, String currentData) {  
  43.   if (null == remainingData) {  
  44.    return;// 如果没有数据则直接返回,什么也不做  
  45.   }  
  46.   // 剩余的情况都是链表不为空的时候产生的  
  47.   if (1 == remainingData.size() || 2 == remainingData.size()) {  
  48.    printPermutation(remainingData, currentData);  
  49.   } else {  
  50.    for (int currentIndex = 0; currentIndex < remainingData.size(); currentIndex++) {  
  51.     List<String> tempList = new ArrayList<String>(remainingData);  
  52.     getPermutation(tempList, currentData  
  53.       + tempList.remove(currentIndex));  
  54.    }  
  55.   }  
  56.  }  
  57.   
  58.  private String getCountInformation() {  
  59.   return new StringBuilder().append("第").append(currentCount++).append(  
  60.     "个:").toString();  
  61.  }  
  62.   
  63.  /** 
  64.   * 当剩下小于等于两个数据时,输出符合条件的组合 
  65.   *  
  66.   * @param remainingData 
  67.   * @param currentData 
  68.   */  
  69.  private void printPermutation(List<String> remainingData, String currentData) {  
  70.   if (1 == remainingData.size()) {  
  71.    System.out.println(new StringBuilder()  
  72.      .append(getCountInformation()).append(remainingData.get(0))  
  73.      .toString());  
  74.   } else if (2 == remainingData.size()) {  
  75.    System.out.println(new StringBuilder()  
  76.      .append(getCountInformation()).append(currentData).append(  
  77.        remainingData.get(0)).append(remainingData.get(1))  
  78.      .toString());  
  79.    System.out.println(new StringBuilder()  
  80.      .append(getCountInformation()).append(currentData).append(  
  81.        remainingData.get(1)).append(remainingData.get(0))  
  82.      .toString());  
  83.   }  
  84.  }  
  85.   
  86.  public static void main(String[] args) {  
  87.   Permutation perm = new Permutation();  
  88.   perm.getPermutation(sampleData, EMPTY);  
  89.  }  
  90. }  

输出结果情况 

一个元素: 

第1个:A 


两个元素: 

第1个:AB 
第2个:BA 


三个元素: 

第1个:ABC 
第2个:ACB 
第3个:BAC 
第4个:BCA 
第5个:CAB 
第6个:CBA 


五个元素: 

第1个:ABCDE 
第2个:ABCED 
第3个:ABDCE 
第4个:ABDEC 
第5个:ABECD 
第6个:ABEDC 
第7个:ACBDE 
第8个:ACBED 
第9个:ACDBE 
第10个:ACDEB 
第11个:ACEBD 
第12个:ACEDB 
第13个:ADBCE 
第14个:ADBEC 
第15个:ADCBE 
第16个:ADCEB 
第17个:ADEBC 
第18个:ADECB 
第19个:AEBCD 
第20个:AEBDC 
第21个:AECBD 
第22个:AECDB 
第23个:AEDBC 
第24个:AEDCB 
第25个:BACDE 
第26个:BACED 
第27个:BADCE 
第28个:BADEC 
第29个:BAECD 
第30个:BAEDC 
第31个:BCADE 
第32个:BCAED 
第33个:BCDAE 
第34个:BCDEA 
第35个:BCEAD 
第36个:BCEDA 
第37个:BDACE 
第38个:BDAEC 
第39个:BDCAE 
第40个:BDCEA 
第41个:BDEAC 
第42个:BDECA 
第43个:BEACD 
第44个:BEADC 
第45个:BECAD 
第46个:BECDA 
第47个:BEDAC 
第48个:BEDCA 
第49个:CABDE 
第50个:CABED 
第51个:CADBE 
第52个:CADEB 
第53个:CAEBD 
第54个:CAEDB 
第55个:CBADE 
第56个:CBAED 
第57个:CBDAE 
第58个:CBDEA 
第59个:CBEAD 
第60个:CBEDA 
第61个:CDABE 
第62个:CDAEB 
第63个:CDBAE 
第64个:CDBEA 
第65个:CDEAB 
第66个:CDEBA 
第67个:CEABD 
第68个:CEADB 
第69个:CEBAD 
第70个:CEBDA 
第71个:CEDAB 
第72个:CEDBA 
第73个:DABCE 
第74个:DABEC 
第75个:DACBE 
第76个:DACEB 
第77个:DAEBC 
第78个:DAECB 
第79个:DBACE 
第80个:DBAEC 
第81个:DBCAE 
第82个:DBCEA 
第83个:DBEAC 
第84个:DBECA 
第85个:DCABE 
第86个:DCAEB 
第87个:DCBAE 
第88个:DCBEA 
第89个:DCEAB 
第90个:DCEBA 
第91个:DEABC 
第92个:DEACB 
第93个:DEBAC 
第94个:DEBCA 
第95个:DECAB 
第96个:DECBA 
第97个:EABCD 
第98个:EABDC 
第99个:EACBD 
第100个:EACDB 
第101个:EADBC 
第102个:EADCB 
第103个:EBACD 
第104个:EBADC 
第105个:EBCAD 
第106个:EBCDA 
第107个:EBDAC 
第108个:EBDCA 
第109个:ECABD 
第110个:ECADB 
第111个:ECBAD 
第112个:ECBDA 
第113个:ECDAB 
第114个:ECDBA 
第115个:EDABC 
第116个:EDACB 
第117个:EDBAC 
第118个:EDBCA 
第119个:EDCAB 
第120个:EDCBA 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值