递归全排列算法

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

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

}


你可能感兴趣的:(java,算法)