フロントエンドtree jsonフォーマットデータの取得を再帰的に実現

24991 ワード

フロントエンドtree jsonフォーマットデータの取得を再帰的に実現
  • 問題説明
  • 構想
  • コード実装
  • 問題の説明
    各ビジネス・エンティティの階層関係を表すために、バックグラウンド・システムの多くのテーブル構造は、次のような構造に従って設計されています.
    id
    pid
    name
    しかし、フロントエンドに必要なデータ構造はTree JSON構造である.
    [{
    	"id": 1,
    	"name": "  ",
    	"children": [{
    		"id": 3,
    		"name": "    ",
    		"children": [{
    			"id": 5,
    			"name": "   ",
    			"children": []
    		}]
    	}, {
    		"id": 4,
    		"name": "    ",
    		"children": [{
    			"id": 6,
    			"name": "   ",
    			"children": []
    		}]
    	}]
    }, {
    	"id": 2,
    	"name": "  ",
    	"children": []
    }]
    

    構想
    再帰的な考え方:
  • 再帰終了条件(listでpidがフィルタされた結果listは空)
  • 再帰終了時の処理方法(処理しない)
  • を与える.
  • 繰り返し論理(treeノードを組み立てるtreeノードListに追加)
  • を抽出する.
    まず、再帰関数のパラメータを確認します.
  • クエリーが必要なフラットなビジネスエンティティList
  • リスト結果エンティティのセットが必要です.エンティティ内の3つのフィールド(カスタムフィールド名)id,name,childrenが必要です.ここではMap
  • を簡単に使用します.
  • 現在のレベルのpid
  • をクエリー
    コード実装
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    import java.util.ArrayList;
    import java.util.LinkedHashMap;
    import java.util.List;
    import java.util.stream.Collectors;
    
    public class ListToTreeTest {
    
        public static void main(String[] args) throws Exception {
            List<Item> list = getList();
            ArrayList<LinkedHashMap<String, Object>> tree = new ArrayList<>();
            loadTree(list, tree, 0l);
            String s = new ObjectMapper().writeValueAsString(tree);
            System.out.println(s);
        }
    
        public static void loadTree(List<Item> list, List<LinkedHashMap<String, Object>> listTreeNode, Long pid) {
            LinkedHashMap<String, Object> tmpMap = null;
            // list      pid Item  
            List<Item> tmpList = list.stream().filter(x -> x.getPid() == pid).collect(Collectors.toList());
            for(Item item : tmpList) {
                tmpMap = new LinkedHashMap<>();
                tmpMap.put("id", item.getId());
                tmpMap.put("name", item.getName());
                tmpMap.put("children", new ArrayList<LinkedHashMap<String,Object>>());
                listTreeNode.add(tmpMap);
                //children         ,  children      pid    id
                loadTree(list, (List<LinkedHashMap<String, Object>>) tmpMap.get("children"), (Long) tmpMap.get("id"));
            }
        }
    	//      
        public static List<Item> getList() {
            Item parent1 = new Item();
            parent1.setId(1l);
            parent1.setName("  ");
            parent1.setPid(0l);
    
            Item parent2 = new Item();
            parent2.setId(2l);
            parent2.setName("  ");
            parent2.setPid(0l);
    
            Item parent3 = new Item();
            parent3.setId(3l);
            parent3.setName("    ");
            parent3.setPid(1l);
    
            Item parent4 = new Item();
            parent4.setId(4l);
            parent4.setName("    ");
            parent4.setPid(1l);
    
            Item parent5 = new Item();
            parent5.setId(5l);
            parent5.setName("   ");
            parent5.setPid(3l);
    
            Item parent6 = new Item();
            parent6.setId(6l);
            parent6.setName("   ");
            parent6.setPid(4l);
    
            ArrayList<Item> items = new ArrayList<>();
            items.add(parent1);
            items.add(parent2);
            items.add(parent3);
            items.add(parent4);
            items.add(parent5);
            items.add(parent6);
            return items;
        }
    }
    //     
    class Item {
        private Long id;
    
        private String name;
    
        private Long pid;
    
        public Long getId() {
            return id;
        }
        public void setId(Long id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Long getPid() {
            return pid;
        }
        public void setPid(Long pid) {
            this.pid = pid;
        }
    }