递归全排列算法

利用递归实现的全排列算法,需要的朋友拿去用了,不理解的留言给我...
废话不说了,接招:


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);
}
}
}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值