1. 程式人生 > >遍歷所有排列可能的類,比如列出“a”,"b","c"所有排列的可能

遍歷所有排列可能的類,比如列出“a”,"b","c"所有排列的可能

使用方法 

 

Tree tree = new Tree();
		tree.addChild("1");
		tree.addChild("2");
		tree.addChild("3");
		tree.addChild("4");
		ArrayList<ArrayList<String>> order = tree.getOrder();
		System.out.println("共有" + tree.getOrderSize() + "種排列");
		for (ArrayList<String> arrayList : order) {
			System.out.println(arrayList);
		}

輸出結果

共有24種排列
[1, 2, 3, 4]
[1, 2, 4, 3]
[1, 3, 2, 4]
[1, 3, 4, 2]
[1, 4, 2, 3]
[1, 4, 3, 2]
[2, 1, 3, 4]
[2, 1, 4, 3]
[2, 3, 1, 4]
[2, 3, 4, 1]
[2, 4, 1, 3]
[2, 4, 3, 1]
[3, 1, 2, 4]
[3, 1, 4, 2]
[3, 2, 1, 4]
[3, 2, 4, 1]
[3, 4, 1, 2]
[3, 4, 2, 1]
[4, 1, 2, 3]
[4, 1, 3, 2]
[4, 2, 1, 3]
[4, 2, 3, 1]
[4, 3, 1, 2]
[4, 3, 2, 1]

 

構思:

利用樹,在第一層按順序新增n個字串,然後在第二層,給每個第一層節點,按順序新增不重複的n-1個字串................達到指定層數後,把產生的資料加入結果集合

 

工具類

 

package 遍歷順序;

import java.lang.reflect.Array;
import java.util.ArrayList;

public class Tree {
	// 用來存放需要解析的資料
	private ArrayList<String> dataList = new ArrayList<>();
	// 用來存放結果
	private ArrayList<ArrayList<String>> endList = new ArrayList<>();
	// 用來存放分支
	private ArrayList<TreeNode> root = new ArrayList<TreeNode>();

	public void addChild(String str) {
		// 新增需要解析的資料
		dataList.add(str);
	}

	// 新增一個集合
	public void add_a_list(ArrayList<String> list) {
		dataList.addAll(list);
	}

	public void clear() {
		dataList.clear();
	}

	public void set_a_list(ArrayList<String> list) {
		clear();
		add_a_list(list);
	}

	public ArrayList<ArrayList<String>> getOrder() {
		int i = 0;
		for (String str : dataList) {
			// 新建一個節點
			TreeNode treeNode = new TreeNode();
			// 節點加入資料
			treeNode.data.add(str);
			// 運算節點
			treeNode.setChiild(1, i++);
			// 將節點加入根節點
			root.add(treeNode);
		}
		return endList;
	}

	public int getOrderSize() {
		int i = 0;
		for (String str : dataList) {
			// 新建一個節點
			TreeNode treeNode = new TreeNode();
			// 節點加入資料
			treeNode.data.add(str);
			// 運算節點
			treeNode.setChiild(1, i++);
			// 將節點加入根節點
			root.add(treeNode);
		}
		return endList.size();
	}

	private class TreeNode {
		// 當前節點的資料
		public ArrayList<String> data = new ArrayList<>();
		// 當前節點的孩子
		public ArrayList<TreeNode> child;
		// 當前處於第幾層
		public int step;
		// 當前節點在兄弟中是第幾個
		public int indext;

		public void setChiild(int step, int indext) {
			this.step = step;
			this.indext = indext;

			int i = 0;
			for (String str : dataList) {
				// 新建一個節點
				TreeNode treeNode = new TreeNode();
				// 將當前節點資料複製到一個子節點
				treeNode.data = (ArrayList<String>) data.clone();
				if (step >= dataList.size() && endList.indexOf(data) < 0) {
					// 如果生成一個新的順序,就加入結果裡
					endList.add(data);
					continue;
				}
				if (treeNode.data.indexOf(str) >= 0) {
					// 如果節點裡將加入重複資料
					continue;
				}
				// 節點加入資料
				treeNode.data.add(str);
				// 運算節點
				treeNode.setChiild(step + 1, i++);
				// 將節點加入根節點
				root.add(treeNode);
			}
		}
	}
}