给定一组对象,要求给出这些对象数据的全排列。 例子: 对象数据{A}, 全排列 [A] 对象数据 {A,B} 全排列 [AB] [BA] 对象数据 {A,B,C}全排列 [ABC][ACB][BAC][BCA][CAB][CBA] ... 依此类推 根据对象数据的个数,得到的全排列个数为 Num = N! (N为对象数据的个数)本例子采用递归方式来实现。本例子中没有考虑当出现相同数据时,产生相同的组合,如果需要保持每个组合的唯一性,可以将得到的组合放置到一个结果List中,然后通过contains(Object o)方法判断需要不需要加入到结果链表中就好了
代码:
输出结果情况
一个元素:
第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
代码:
- import java.util.ArrayList;
- import java.util.List;
- /**
- * 题目: 给定一组对象,要求给出这些对象数据的全排列。 例子: 对象数据{A}, 全排列 [A] 对象数据 {A,B} 全排列 [AB] [BA] 对象数据
- * {A,B,C}全排列 [ABC][ACB][BAC][BCA][CAB][CBA] ... 依此类推 根据对象数据的个数, 得到的全排列个数为 Num =
- * N! (N为对象数据的个数)
- *
- * 本例子采用递归方式来实现。
- * 本例子中没有考虑当出现相同数据时,产生相同的组合,
- * 如果需要保持每个组合的唯一性,可以将得到的组合放置到一个结果List中,
- * 然后通过contains(Object o)方法判断需要不需要加入到结果链表中就好了
- *
- * @author Eric Wang
- * @version 1.0
- *
- */
- public class Permutation {
- private static final String EMPTY = "";
- // 通过列表来存放样本数据
- private static List<String> sampleData = new ArrayList<String>();
- static {
- // 初始化sampleData的值
- sampleData.add("A");
- sampleData.add("B");
- sampleData.add("C");
- sampleData.add("D");
- sampleData.add("E");
- }
- //统计个数
- private int currentCount = 1;
- /**
- *
- * @param remainingData :
- * 剩余的需要递归的数据
- * @param currentData :
- * 目前得到的数据
- */
- public void getPermutation(List<String> remainingData, String currentData) {
- if (null == remainingData) {
- return;// 如果没有数据则直接返回,什么也不做
- }
- // 剩余的情况都是链表不为空的时候产生的
- if (1 == remainingData.size() || 2 == remainingData.size()) {
- printPermutation(remainingData, currentData);
- } else {
- for (int currentIndex = 0; currentIndex < remainingData.size(); currentIndex++) {
- List<String> tempList = new ArrayList<String>(remainingData);
- getPermutation(tempList, currentData
- + tempList.remove(currentIndex));
- }
- }
- }
- private String getCountInformation() {
- return new StringBuilder().append("第").append(currentCount++).append(
- "个:").toString();
- }
- /**
- * 当剩下小于等于两个数据时,输出符合条件的组合
- *
- * @param remainingData
- * @param currentData
- */
- private void printPermutation(List<String> remainingData, String currentData) {
- if (1 == remainingData.size()) {
- System.out.println(new StringBuilder()
- .append(getCountInformation()).append(remainingData.get(0))
- .toString());
- } else if (2 == remainingData.size()) {
- System.out.println(new StringBuilder()
- .append(getCountInformation()).append(currentData).append(
- remainingData.get(0)).append(remainingData.get(1))
- .toString());
- System.out.println(new StringBuilder()
- .append(getCountInformation()).append(currentData).append(
- remainingData.get(1)).append(remainingData.get(0))
- .toString());
- }
- }
- public static void main(String[] args) {
- Permutation perm = new Permutation();
- perm.getPermutation(sampleData, EMPTY);
- }
- }
输出结果情况
一个元素:
第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