java实现全排列支持泛型
二话不说直接上代码
入参:集合
[a,bb,cc,dd]
出参:大集合装了24个小集合,总共24种情况。
[[a, bb, cc, dd], [a, bb, dd, cc], [a, cc, bb, dd], [a, cc, dd, bb], [a, dd, bb, cc], [a, dd, cc, bb], [bb, a, cc, dd], [bb, a, dd, cc], [bb, cc, a, dd], [bb, cc, dd, a], [bb, dd, a, cc], [bb, dd, cc, a], [cc, a, bb, dd], [cc, a, dd, bb], [cc, bb, a, dd], [cc, bb, dd, a], [cc, dd, a, bb], [cc, dd, bb, a], [dd, a, bb, cc], [dd, a, cc, bb], [dd, bb, a, cc], [dd, bb, cc, a], [dd, cc, a, bb], [dd, cc, bb, a]]
package com.newupbank.apriori3;
import java.util.ArrayList;
import java.util.List;
/**
* a,b,c,d四个元素全排列 ,支持泛型
* public 递归方法(参数列表){
* if(列表的元素只有两个){
* 输出:“元素一元素二”
* 输出:“元素二元素一”
* }else{
* //此时元素有两个以上,这时候要使用递归
* 递归方法(参数列表)//使用递归方法将元素细分
* }
* }
*/
public class ListAllPrint {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("bb");
list.add("cc");
list.add("dd");
List<String> prefix = new ArrayList<>();
List<Object> resultList = new ArrayList<>();
printAll(list, prefix, list.size(), resultList);
System.out.println(resultList);
}
/**
* printAll是输出全排列的递归调用方法,
*
* @param candidate 候选集合:元素个数递减
* @param prefix 累加集合:元素个数递增
* @param length 初始list的长度,用于判断程序结束
* @param resultList 结果集合,元素为所有可能的小集合
* @param <T> 泛型
*/
public static <T> void printAll(List<T> candidate, List<T> prefix, int length, List<Object> resultList) {
if (prefix.size() == length) {
System.out.println(prefix);
resultList.add(prefix);
} else {
for (int i = 0; i < candidate.size(); i++) {
List<T> temp2 = new ArrayList<>(candidate);
T remove = temp2.remove(i);
List<T> prefix2 = new ArrayList<>(prefix);
prefix2.add(remove);
printAll(temp2, prefix2, length, resultList);
}
}
}
}