Javaでツリー構造オブジェクト/コレクションをロードする方法

2188 ワード

子クラスのparentIdが親クラスのidである「親子」関係を持つコレクションが作成されました.しかし,これらのデータは親サブセットのツリー構造に厳密に従って配列されていないため,プログラムで処理する必要がある.
基本的な考え方:
1)特定の構造のオブジェクト(id、parentId、children属性があり、childrenは独自のタイプの集合である)が必要であり、ソース集合(以下、上述した集合を総称してソース集合と呼ぶ)がこの構造を満たさない場合は、変換する必要がある.
2)この集合を2つのサイクル、すなわち内層サイクルと外層サイクルとする.内側ループで外側ループの各要素の親ノードを順に検索し、見つかったら外側ループのchildrenに入れ、最初にchildrenに入れる場合はchildrenセットを作成し、2回目の3回目以降に置くときにこのchildrenを取り出して入れます.親が見つからない場合は、ルートノードであることを示し、この要素を最初に定義したターゲットセットに入れます.
以下に例を示します.例には個性的な修正が含まれていますが、基本的な考え方は上記と同じです.
 
//  menu 
public List createMenuTree(List menuList) {
        List result = new ArrayList<>();
        List targetList = convert2MJ(menuList);
        for (MenuJson mj1 : targetList) {
            boolean isRoot = true;
            for (MenuJson mj2 : targetList) {
                if (mj2.getId().equals(mj1.getParentId())) {
                	isRoot = false;
                    if (mj2.getChildren() == null) {
                    	mj2.setChildren(new ArrayList());
                    }
                    mj2.getChildren().add(mj1);
                    break;
                }
            }
            for (MenuJson mj2 : targetList) {
            	if(mj1.getId().equals(mj2.getParentId())) {
            		mj1.setState("closed");
            		break;
            	}
            }
            if (isRoot) {
            	result.add(mj1);
            }
        }
        return result;
    }
//    
private List convert2MJ(List menuList) {
		List list = new ArrayList<>();
		for(Menu menu : menuList) {
			MenuJson mj = new MenuJson();
			mj.setAttributes(menu.getUrl());
			mj.setId(menu.getMid());
			mj.setText(menu.getName());
			mj.setParentId(menu.getParentId());
			list.add(mj);
		}
		return list;
	}

フロントエンドページのEasyUIのtreeを適用するために,ここではソースセットをMenuJsonタイプのセットに変換する.最終処理は集合であり、ページにjsonタイプが必要な場合はcomを直接使用することができる.alibaba.fastjson.JSONObject.toJSOnString(…)メソッドはjson文字列に変換されます.