我不确定这是最有效的方法,但应该可以工作。我会尝试将每个团队ID映射到其正确的父级。这里的难点在于您的表包含冗余信息,因此必须能够将其清除。
思路是从根开始递归地构建树形结构,并在深入树形结构时修改父级节点,以找到更好的父级节点。以下是一个快速示例独立程序,应该能帮助您入门。
public class TestTree {
private static List<Entry> entries = new ArrayList<Entry>();
public static void main(String[] args) throws Exception {
entries.add(new Entry(1, 1, 1, "T1"));
entries.add(new Entry(2, 2, 2, "T2"));
entries.add(new Entry(3, 2, 1, "T2"));
entries.add(new Entry(4, 3, 1, "T3"));
entries.add(new Entry(5, 3, 3, "T3"));
entries.add(new Entry(6, 4, 4, "T4"));
entries.add(new Entry(7, 4, 2, "T4"));
entries.add(new Entry(8, 4, 1, "T4"));
int root = 1;
Map<Integer, Integer> tree = new HashMap<Integer, Integer>();
buildTree(tree, root);
System.out.println(tree);
}
private static void buildTree(Map<Integer, Integer> tree, int parentId) {
boolean dirty = false;
for(Entry entry : entries) {
if(entry.parentId == parentId && entry.teamId != parentId) {
tree.put(entry.teamId, parentId);
dirty = true;
}
}
if(dirty) {
for(Integer nodeId : tree.keySet()) {
if(tree.get(nodeId) == parentId) buildTree(tree, nodeId);
}
}
}
private static class Entry {
int id;
int teamId;
int parentId;
String teamName;
Entry(int id, int teamId, int parentId, String teamName) {
this.id = id;
this.teamId = teamId;
this.parentId = parentId;
this.teamName = teamName;
}
}
更新
针对那些不喜欢递归方法的人(以及如果您的树太深,会使方法调用栈爆炸):
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Stack;
public class TestTree {
private static List<Entry> entries = new ArrayList<Entry>();
public static void main(String[] args) throws Exception {
entries.add(new Entry(1, 1, 1, "T1"));
entries.add(new Entry(2, 2, 2, "T2"));
entries.add(new Entry(3, 2, 1, "T2"));
entries.add(new Entry(4, 3, 1, "T3"));
entries.add(new Entry(5, 3, 3, "T3"));
entries.add(new Entry(6, 4, 4, "T4"));
entries.add(new Entry(7, 4, 2, "T4"));
entries.add(new Entry(8, 4, 1, "T4"));
int root = 1;
Map<Integer, Integer> tree = new HashMap<Integer, Integer>();
Stack<Integer> stack = new Stack<Integer>();
stack.push(root);
do {
int parentId = stack.pop();
if(buildTree(tree, parentId)) {
for(Integer nodeId : tree.keySet()) {
if(tree.get(nodeId) == parentId) stack.push(nodeId);
}
}
} while(!stack.isEmpty());
System.out.println(tree);
}
private static boolean buildTree(Map<Integer, Integer> tree, int parentId) {
boolean dirty = false;
for(Entry entry : entries) {
if(entry.parentId == parentId && entry.teamId != parentId) {
tree.put(entry.teamId, parentId);
dirty = true;
}
}
return dirty;
}
private static class Entry {
int id;
int teamId;
int parentId;
String teamName;
Entry(int id, int teamId, int parentId, String teamName) {
this.id = id;
this.teamId = teamId;
this.parentId = parentId;
this.teamName = teamName;
}
}
}