1

2D配列リストから入力したSWTツリーがありますが、正しく表示されません。トップツリーアイテムをアイテム番号でグループ化しようとしていますが、アルゴリズムがうまくいきません。もう少しわかりやすく説明するために写真を添付し​​ました。アイテム4324226は、別の子アイテムで2回表示されます。両方の子を、1つの親の下にグループ化します。

ここに画像の説明を入力してください

これが私のツリーのコードです。何か案は?私が見落としている単純なものはありますか?

    long[][] listOrders;
    listOrders = database.getUnfinishedOrders();


    for (int i=0; i<listOrders.length; i++) {
        TreeItem iItem = new TreeItem (tree, 0);
        iItem.setText (Long.toString(listOrders[i][0]));
        for (int j=1; j<listOrders[i].length; j++) {
            TreeItem jItem = new TreeItem (iItem, 0);
            jItem.setText (Long.toString(listOrders[i][j]));
        }
    }
4

2 に答える 2

2

前にモデルを作成し(グループ化する)、これを実行した直後にこれをツリーに追加することを提案します。

これは、設計の観点からははるかに優れています。ビューのものはデータのものから分離されているからです。

マップを使用して、特定の順序の要素のリストを格納できます。

于 2013-01-17T18:44:47.597 に答える
1

@Michal Borekの提案に続いて、Map<Long, Set<Long>>データ構造で親と子をグループ化するコードがあります。これは、すべての親について、繰り返される子を1回だけ含める必要があることを前提としています(それ以外の場合はSetListおよびLinkedHashSetで置き換えるだけですArrayList)。

private Map<Long, Set<Long>> buildModel(long[][] originalModel) {
    final Map<Long, Set<Long>> model = new LinkedHashMap<Long, Set<Long>>();
    for (int i = 0; i < originalModel.length; i++) {
        model.put(originalModel[i][0], new LinkedHashSet<Long>());
    }

    for (int i = 0; i < originalModel.length; i++) {
        final Long key = originalModel[i][0];
        for (int j = 1; j < originalModel[i].length; j++) {
            model.get(key).add(originalModel[i][j]);
        }
    }

    return model;
}

そして、これはSWTツリーを構築する方法です。

long[][] listOrders = database.getUnfinishedOrders();
final Map<Long, Set<Long>> ordersModel = buildModel(listOrders);

for (Map.Entry<Long, Set<Long>> entry : ordersModel.entrySet()) {
    TreeItem iItem = new TreeItem (tree, 0);
    iItem.setText(entry.getKey().toString()); 
    for (Long child : entry.getValue()) {
       TreeItem jItem = new TreeItem (iItem, 0);
       jItem.setText (child.toString());
    }
}
于 2013-01-18T01:29:00.983 に答える