存在这种表结构数据
ID | PID | NAME | LEVEL |
---|---|---|---|
ID唯一,NAME有重复,存在多个根节点,根节点与子节点是一对多关系,层级不固定,存在需求:要根据NAME查出对应ID,所以定义一个树形数据结构
定义内部类Node,Node存储ID、NAME与其子节点NODES,主要由NODE与Map构造
public class Struct {
/**
* 存放所有一级节点
*/
private Map<String, Node> nodes;
public void fresh(List<TreeObj> list) {
Map<String, Node> tempNodes = new HashMap<>(16);
Map<String, Node> expandNodes = new HashMap<>(list.size());
for (TreeObj ele : list) {
expandNodes.put(ele.getAutoId(), new Node(ele.getAutoId(), ele.getName()));
}
for (TreeObj ele : list) {
if ("1".equals(ele.getLevel())) {
tempNodes.put(ele.getAutoId(), expandNodes.get(ele.getAutoId()));
} else {
String pId = ele.getpId();
if (expandNodes.containsKey(pId)) {
expandNodes.get(pId).addNode(expandNodes.get(ele.getAutoId()));
}
}
}
nodes = tempNodes;
}
public String[] getKeyByValue(String[] values) {
String[] keys = new String[values.length];
doGetKeyByValue(values, keys, 0, nodes);
return keys;
}
/**
* 递归 根据value查key
* keys为返回结果
*/
private void doGetKeyByValue(String[] values, String[] keys, int i, Map<String, Node> nodes) {
// 退出
if (values.length <= i) {
return;
}
for (Node node : nodes.values()) {
if (node.value.equals(values[i])) {
keys[i] = node.key;
doGetKeyByValue(values, keys, ++i, node.nodes);
break;
}
}
}
private class Node {
private String key;
private String value;
private Map<String, Node> nodes;
public Node(String key, String value) {
this.key = key;
this.value = value;
}
public void addNode(Node node) {
if (CollUtil.isEmpty(nodes)) {
nodes = new HashMap<>(8);
}
nodes.put(node.key, node);
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Node node = (Node) o;
return key.equals(node.key);
}
@Override
public int hashCode() {
return Objects.hash(key);
}
}
}