【发布时间】:2017-06-21 00:33:13
【问题描述】:
我在 Swing TreeList 中显示的列表中有 100k 项。见 jide-demo 中的 AutoFilterTreeTableDemo https://www.jidesoft.com/products/download.htm
过滤时需要很长时间才能扩展节点。
在分析时,Vector.indexOf() 大约需要 20 秒。我将它切换到 ArrayList 并花费了大约 5 秒。
然后我将列表缓存为Map<Row, Integer>,其中整数是列表中的索引。这将过滤减少到 ~0.2s。
但是,如果我在中间某处添加一行,我必须重建地图,因为列表的索引会发生变化。
是否有使用映射来支持列表索引的数据结构?还是我必须自己处理?
或者,是否有一个普通的 List 具有非常快的 indexOf 时间?我不介意为此牺牲插入/删除时间略微。
第三种选择是我可以使用更优化的可过滤 Swing 网格。
编辑:代码 sn-p:
private Map<Row, Integer> rowLookup = new ConcurrentHashMap<Row, Integer>();
@Override
public int getRowIndex(Row row) {
if(rowLookup.isEmpty()) {
List<Row> existingRows = getRows();
for(int i = 0; i < existingRows.size(); i++) {
Row mappingRow = existingRows.get(i);
rowLookup.put(mappingRow, i);
}
}
if(row == null) {
return -1;
} else {
Integer lineNumber = rowLookup.get(row);
if(lineNumber == null) {
lineNumber = -1;
}
return lineNumber;
}
}
【问题讨论】:
-
ArrayList具有比哈希映射更快的随机访问(通过索引访问)。 (顺便说一句,您没有发布您使用的地图实现)。 -
@MouseEvent 但索引需要朝另一个方向发展:行到索引,而不是索引到行。
-
您所描述的由地图支持的列表是否不支持重复条目并因此是一个集合?
-
你可以用来展示的最抽象的数据结构是什么?例如,只是
Iterable的东西会起作用吗? -
根据您的要求,ArrayList
有 O(1) 插入和 O(n) indexOf。 HashMap
有 O(n) 插入和 O(1) indexOf。如果您要创建一个将平衡树(Node
缓存其左子树的大小)和 HashMap
> 配对在一起的数据结构,您可以获得 O(log n) 插入和O(log n) indexOf (O(1) 使用 HashMap 找到内部节点,然后 O(log n) 在您向上走时添加左子树大小)。这是否是一个合理的权衡取决于您的情况。