遍歷所有排列可能的類,比如列出“a”,"b","c"所有排列的可能
阿新 • • 發佈:2018-11-30
使用方法
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); } } } }