1

我有一个从 2d 数组列表中填充的 SWT 树,但结果并不完全正确。我正在尝试按项目编号对顶级树项目进行分组,但我的算法没有任何运气。我附上了一张图片来更好地解释一下。项目 4324226 出现两次,带有不同的子项目,我想将两个孩子分组在一个父项下。

在此处输入图像描述

这是我的树代码。有任何想法吗?我忽略了一些简单的事情吗?

    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>>数据结构中对父级和子级进行分组的代码。它假设对于每个父母,重复的孩子应该只包含一次(否则只需替换SetbyListLinkedHashSetby 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 回答