遍历所有排列可能的类,比如列出“a”|遍历所有排列可能的类,比如列出“a”,"b","c"所有排列的可能

使用方法

Tree tree = new Tree(); tree.addChild("1"); tree.addChild("2"); tree.addChild("3"); tree.addChild("4"); ArrayList> order = tree.getOrder(); System.out.println("共有" + tree.getOrderSize() + "种排列"); for (ArrayList 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个字符串................达到指定层数后,把产生的数据加入结果集合
【遍历所有排列可能的类,比如列出“a”|遍历所有排列可能的类,比如列出“a”,"b","c"所有排列的可能】
工具类

package 遍历顺序; import java.lang.reflect.Array; import java.util.ArrayList; public class Tree { // 用来存放需要解析的数据 private ArrayList dataList = new ArrayList<>(); // 用来存放结果 private ArrayList> endList = new ArrayList<>(); // 用来存放分支 private ArrayList root = new ArrayList(); public void addChild(String str) { // 添加需要解析的数据 dataList.add(str); } // 添加一个集合 public void add_a_list(ArrayList list) { dataList.addAll(list); } public void clear() { dataList.clear(); } public void set_a_list(ArrayList list) { clear(); add_a_list(list); } public ArrayList> 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 data = https://www.it610.com/article/new ArrayList<>(); // 当前节点的孩子 public ArrayList 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 = https://www.it610.com/article/(ArrayList) 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); } } } }

ps: 数据大于7个会非常慢,其实用数组更好一些,这只是个练习

    推荐阅读