遍历所有排列可能的类,比如列出“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个会非常慢,其实用数组更好一些,这只是个练习
推荐阅读
- 列出所有自定义的function和view
- 幸福的人都是相似的,所有幸福的女人,都做好了这2点
- 不理解句意,你还想做对所有GRE填空题()
- 你以为你熬过了所有的难熬的夜,却不知何时到白天
- 微小说/不是所有苦难都值得同情
- 再见,L
- 正确对待所有事情
- 25岁的我一无所有,我很慌
- 感恩生命中的所有遇见
- JavaScript|JavaScript — 初识数组、数组字面量和方法、forEach、数组的遍历