メニューツリーのソート問題に関する解決策(一)

3782 ワード

最近はメニュー管理の展示をしていますが、ツリーリストは父親が子の前にいて、子が父に続いて正確に展示しなければならないことが分かりました.資料を調べた後、二つの解決案が見つかりました.一つは再帰的に並べ替えられたものです.もう一つは多叉樹を使って巡回します.多叉樹を使って巡回する案は「メニューツリーの並べ替え問題に関する解決案(二)」を参照してください..私はこの二つの案を簡単にカプセル化しました.本文は予備として忘れました.
再帰的にメニューツリーを並べ替える
  • ツリーノードのインターフェース
  • public interface TreeNode{
        S getId();
        S getPId();
        /**
         *             
         */
        boolean isRootNode();
    }
    
  • 再帰的並べ替え
  • /**
     *      list   
     * T     
     * K   id pId   
     */
    public class TreeListSort {
        List nodes;
        List resultList;
    
        /**
         *       list
         */
        public List getSortTreeList(List nodeList){
            nodes=nodeList;
            resultList=new ArrayList<>();
            for (T node:nodes){
                if (node.isRootNode()){
                    resultList.add(node);
                    if (hasChild((K) node.getId())){
                        traverseChildren((K) node.getId());
                    }
                }
            }
            return resultList;
        }
    
        /**
         *      
         */
        public void traverseChildren(K id){
            for (T node:nodes){
                if (node.getPId()!=null&&node.getPId().equals(id)){
                    resultList.add(node);
                    if (hasChild((K) node.getId())){
                        traverseChildren((K) node.getId());
                    }
                }
            }
        }
    
        /**
         *         
         */
        public boolean hasChild(K id){
            for (T node:nodes){
                if (node.getPId()!=null&&node.getPId().equals(id)){
                    return true;
                }
            }
            return false;
        }
    }
    
  • 具体的なノードのエンティティ
  • /**
     *             id、 id             
     */
    public class TestNode implements TreeNode {
        private int nodeId;
        private String nodeName;
        private int nodePId;
        @Override
        public Integer getId() {
            return nodeId;
        }
       @Override
        public Integer getPId() {
            return nodePId;
        }
       @Override
        public boolean isRootNode() {
            return nodePId == 0;
        }
        public TestNode() {
        }
        public TestNode(int nodeId, String nodeName, int nodePId) {
            this.nodeId = nodeId;
            this.nodeName = nodeName;
            this.nodePId = nodePId;
        }
    }
    
  • を使用します.
    public class Main {
        public static void main(String []args){
            List testNodes=new ArrayList<>();
            testNodes.add(new TestNode(1,"1",0));
            testNodes.add(new TestNode(2,"2",0));
            testNodes.add(new TestNode(3,"3",0));
            testNodes.add(new TestNode(4,"1-4",1));
            testNodes.add(new TestNode(5,"2-5",2));
            testNodes.add(new TestNode(6,"3-6",3));
            testNodes.add(new TestNode(7,"1-4-7",4));
            testNodes.add(new TestNode(8,"1-4-8",4));
            testNodes.add(new TestNode(9,"2-5-9",5));
            testNodes.add(new TestNode(10,"2-5-9-10",9));
            testNodes.add(new TestNode(11,"2-5-9-10-11",10));
            testNodes.add(new TestNode(12,"2-5-9-10-11-12",11));
            testNodes.add(new TestNode(13,"2-5-9-10-11-12-13",12));
            testNodes.add(new TestNode(14,"2-5-9-10-11-12-13-14",13));
            testNodes.add(new TestNode(15,"2-5-9-10-11-12-13-14-15",14));
            //        
            TreeListSort treeSort=new TreeListSort<>();
            List list=treeSort.getSortTreeList(testNodes);
            for (TestNode node:list){
                System.out.println(node.toString());
            }
        }
    }
    
    マルチツリーを使用して巡回します.「メニューツリーの並べ替え問題に関する解決策(二)」に間違いがあったり、足りなかったら教えてください.ありがとうございます.