У меня есть 100 тыс. Элементов в списке, который отображается в Swing TreeList. См. AutoFilterTreeTableDemo в jide-demo https://www.jidesoft.com/products/download.htmЕсть ли список, поддерживаемый картой?
При фильтрации требуется много времени для расширения узлов.
При профилировании Vector.indexOf() принимал ~ 20 секунд. Я переключил его на ArrayList, и потребовалось ~ 5 секунд.
Затем я кэшировал список как Map<Row, Integer>
, где Integer является индексом в списке. Это уменьшило фильтрацию до ~ 0,2 с.
Однако, если я добавляю строку где-то посередине, я должен перестроить карту, поскольку индексы списка будут изменены.
Есть ли структура данных, которая использует карту для возврата индекса списка? Или мне нужно управлять этим самостоятельно?
В качестве альтернативы, есть ли обычный список, который имеет очень быстрое значение indexOf? Я не против жертвовать временем вставки/удаления немного за счет этого.
Третий вариант: если есть более оптимальная фильтрующая сетка Swing, которую я мог бы использовать.
EDIT: Фрагмент кода:
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' имеет более быстрый случайный доступ (доступ через индекс), чем хеш-карту. (Кстати, вы не смогли опубликовать, какую версию карты вы использовали). – Mordechai
@MouseEvent, но индекс должен идти в другом направлении: строка для индекса, а не индекс для строки. –
Не будет ли список, поддерживаемый картой, как вы ее описываете, не поддерживает дубликаты записей, и поэтому должен быть набор? –