利用递归实现的全排列算法,需要的朋友拿去用了,不理解的留言给我...
废话不说了,接招:
废话不说了,接招:
package com.daily.d0915;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @description: 全排列工具类
* @author: luomeng
* @createDate: 2009-12-4 上午10:21:37
*/
public class QuanPaiLieUtils {
private static List<String> resultList = new ArrayList<String> ();
/**
* List中的字符进行全排列,排列结果放入resultList
* @param dataList 数据List
* @param removedList 临时数据List
*/
private static void paiLie(List<String> dataList,List<String> removedList){
int length = dataList.size();
if(length == 1){
StringBuffer str = new StringBuffer();
for(String obj : removedList){
str.append(obj);
}
str.append(dataList.get(0));
resultList.add(str.toString());
str = null;
}else{
for(int i=0;i<length;i++){
List<String> tempDataList = new ArrayList<String>();
List<String> tempRemovedList = new ArrayList<String>();
tempDataList.addAll(dataList);
tempRemovedList.addAll(removedList);
tempDataList.remove(i);
tempRemovedList.add(dataList.get(i));
paiLie(tempDataList,tempRemovedList);
}
}
}
/**
* 得到全排列后的所有数据,可能会有重复数据
* @param dataList
* @return
*/
public static List<String> getAllData(List<String> dataList){
paiLie(dataList, new ArrayList<String>());
return resultList;
}
/**
* 得到全排列后的不重复数据
* @param dataList
* @return
*/
public static List<String> getUnRepeatData(List<String> dataList){
paiLie(dataList, new ArrayList<String>());
Map<String,String> resultMap = new HashMap<String,String>();
for(String tempStr : resultList){
if(resultMap.get(tempStr)==null){
resultMap.put(tempStr, tempStr);
}
}
return new ArrayList<String>(resultMap.values());
}
/**
* 测试函数
* @param args
*/
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
List<String> resultList = QuanPaiLieUtils.getNoRepeatData(list);
if(null != resultList && resultList.size()>0 ){
String[] strArray = resultList.toArray(new String[0]);
for(String str:strArray){
System.out.println(str);
}
}
}
}