我有一个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]));
}
}
答案 0 :(得分:2)
我建议先创建一个模型(将其分组),然后在执行此操作后将其添加到树中。
从设计角度来看,这会好得多。因为视图内容与数据内容是分开的。
您可以使用地图存储特定订单的元素列表。
答案 1 :(得分:1)
以下@Michal Borek建议是在Map<Long, Set<Long>>
数据结构中对父级和子级进行分组的代码。它假设对于每个父母,重复的孩子只应被包括一次(否则只需Set
替换List
而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());
}
}