遍历所有排列可能的类,比如列出“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);
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/sinat_40387150/article/details/84647571