有如下字符数组:"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; } } }