构建字符树
有如下字符数组:"A","B","AB","AC","ABC","ACD"。需要构建如下字符树
代码如下:
package test;
import com.alibaba.fastjson.JSON;
import org.apache.commons.lang3.StringUtils;
import java.util.*;
public class TestTree {
public static void main(String[] args) {
List<String> strList = Arrays.asList("A","B","AB","AC","ABC","ACD");
Collections.shuffle(strList);
Node root = new Node("");
for(String str:strList){
Node.insertNode(root,str);
}
System.out.println(JSON.toJSONString(root));
System.out.println(JSON.toJSONString(Node.getDataByLayer(root)));
}
static class Node{
//private Node prev;
private String val;
private List<Node> subNodes;
public Node(String val){
this.val = val;
}
/*public Node getPrev() {
return prev;
}
public void setPrev(Node prev) {
this.prev = prev;
}*/
public String getVal() {
return val;
}
public void setVal(String val) {
this.val = val;
}
public List<Node> getSubNodes() {
if(this.subNodes == null){
this.subNodes = new ArrayList<Node>();
}
return subNodes;
}
public void setSubNodes(List<Node> subNodes) {
this.subNodes = subNodes;
}
@Override
public String toString() {
return "Node{" + "val='" + val + '\'' + '}';
}
public static void insertNode(Node node, String val){
if(StringUtils.isEmpty(val)){
return;
}
if(node.getSubNodes().size() == 0){
Node nNode = new Node(val);
node.getSubNodes().add(nNode);
//nNode.setPrev(node);
return;
}
boolean isContain = false;
for(int i = node.getSubNodes().size() - 1;i >= 0;i--){
if(node.getSubNodes().get(i).getVal().contains(val)){ //val被包含
isContain = true;
Node nNode = new Node(val);
Node curNode = node.getSubNodes().get(i);
node.getSubNodes().set(i,nNode);
//nNode.setPrev(node);
//curNode.setPrev(nNode);
nNode.getSubNodes().add(curNode);
}else if(val.contains(node.getSubNodes().get(i).getVal())){ //val包含
isContain = true;
insertNode(node.getSubNodes().get(i),val);
}
}
if(!isContain){
Node nNode = new Node(val);
node.getSubNodes().add(nNode);
//nNode.setPrev(node);
}
}
//按照层获取数据
public static Collection<String> getDataByLayer(Node node){
Deque<Node> queue=new ArrayDeque<>();
queue.add(node);
Collection<String> col = new LinkedHashSet<>();
while(!queue.isEmpty()){
Node temp = queue.remove();
if(!StringUtils.isEmpty(temp.getVal())){
col.add(temp.getVal());
}
queue.addAll(temp.getSubNodes());
}
return col;
}
}
}