Почему бы просто не использовать отсортированную коллекцию в качестве модели таблицы вместо списка. TreeMap кажется логичным, так как все ваши записи упорядочены. Если вам также нужен быстрый доступ по строке или любому другому столбцу, вы можете просто добавить дополнительную карту. В основном вы делаете то, что делают индексы базы данных.
Я почему-то подумал, что вы можете использовать map.headSet (ключ) и найти запись kth - это не сработает. Вы должны быть в состоянии получить из строки таблицы -> EventID (или близко к нему).
если вы используете такую модель
Map<EventID, Event> model = new TreeSet<EventID, Event>();
Концептуально ваш getValueAt () выглядит так:
getValueAt(int row, column) {
eventID = getSortPosition(row);
Event e = model.headSet(eventID).next();
return getColumn(e, column);
}
Ключ может эффективно поддерживать карту из индекса сортировки -> ключ (обратная карта). Это нетривиально, поскольку вставка нового события в самом верху влияет на абсолютный порядок всех тех, кто находится под ним. Кажется, здесь должен быть ответ CS, но он ускользает от меня.
Вот самая базовая реализация:
- при каждой вставке вы обновляете свою карту, а затем материализуете свою отсортированную карту.
ArrayList<Event> orderedEvents = new ArrayList<Event>();
public void insert(Event event) {
model.put(event.getID(), event);
// update the
model.headSet().addAll(orderedEvents);
}
Ваш getValueAt () будет довольно простым.
getValueAt(int row, column) {w);
Event e = orderedEvents.get(row);
return getColumn(e, column);
}
- это делает вставки O (n) вместо O (n log n) (все еще не отлично)
Я думаю, вы должны пересмотреть свой дизайн пользовательского интерфейса
Если пользователи просматривают таблицу строк по 100 КБ, добавление поискового фильтра решит проблему с производительностью:
- Пользователь никогда не будет читать 100k строк
- Если для ваших пользователей имеет смысл выполнять поиск по eventID, тогда это прекрасно работает, когда пользователи выбирают eventID, вы делаете: sortedMap.headSet (searchFilterID) // берете первые 200, помещаете их в вашу таблицу
- Если для пользователей имеет смысл искать по времени, составьте карту и сделайте то же самое.