SWT树种群

时间:2013-01-17 18:39:46

标签: java tree swt

我有一个SWT树,我已经从一个二维数组列表中填充但是它不是很正确。我正在尝试按项目编号对顶部树项目进行分组,我对算法没有任何好运。我附上了一张图片来解释一下。项目4324226出现两次与不同的子项目,我想将两个孩子分组在一个父项下。

enter image description here

这是我的树代码。有任何想法吗?我有什么简单的东西可以忽略吗?

    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]));
        }
    }

2 个答案:

答案 0 :(得分:2)

我建议先创建一个模型(将其分组),然后在执行此操作后将其添加到树中。

从设计角度来看,这会好得多。因为视图内容与数据内容是分开的。

您可以使用地图存储特定订单的元素列表。

答案 1 :(得分:1)

以下@Michal Borek建议是在Map<Long, Set<Long>>数据结构中对父级和子级进行分组的代码。它假设对于每个父母,重复的孩子只应被包括一次(否则只需Set替换ListLinkedHashSet替换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());
    }
}