Я пытаюсь реализовать свой собственный JTable RowFilter, поскольку я использую Java 1.4 (RowFilter, похоже, не существует в этой версии). Однако я все же считаю, что алгоритм, который я использую, может быть заменен гораздо более быстрым. Я пробовал свой алгоритм на фиктивной таблице, которая содержит 30 000 записей и 8 столбцов, и я получаю результат менее чем за секунду. Но иногда это небольшая задержка, возникающая при наборе критериев поиска (в основном это JTextField с DocumentListener). Вот алгоритм я использую:Более быстрый алгоритм поиска в JTable
public void searchList()
{
for(int i=0;i<list.size();i++)
{
Employee e=(Employee)list.get(i);
Pattern pattern=Pattern.compile(search.getText(),Pattern.CASE_INSENSITIVE);
Matcher matcher=pattern.matcher(e.getFname());
if(matcher.find())
{
result.add(e);
continue;
}
matcher=pattern.matcher(e.getLname());
if(matcher.find())
{
result.add(e);
continue;
}
matcher=pattern.matcher(e.getHeight());
if(matcher.find())
{
result.add(e);
continue;
}
matcher=pattern.matcher(e.getOccupation());
if(matcher.find())
{
result.add(e);
continue;
}
matcher=pattern.matcher(e.getSize());
if(matcher.find())
{
result.add(e);
continue;
}
matcher=pattern.matcher(e.getSkills());
if(matcher.find())
{
result.add(e);
continue;
}
matcher=pattern.matcher(e.getSsn());
if(matcher.find())
{
result.add(e);
continue;
}
matcher=pattern.matcher(e.getStrength());
if(matcher.find())
{
result.add(e);
}
}
model.fireTableDataChanged();
table.updateUI();
}
}
Основная структура данных, которые я использую для привязки данных к моему TableModel является ArrayList, который содержит объекты класса под названием «Сотрудник». Другой ArrayList называется результатом, содержит все объекты «Сотрудник», которые соответствуют критериям поиска. Имейте в виду, что фильтрация происходит на всех 8 столбцах. Единственная оптимизация, которую я думаю, это добавить объект «Сотрудник» в совпадение первого столбца вместо того, чтобы проходить через остальные столбцы.
Любые предложения по этому вопросу? Большое спасибо за помощь =)
Несвязанный с вашей проблемой, тем не менее важный: никогда не звоните updateUI в код приложения! Он существует для (почти) эксклюзивного использования подключаемого механизма LAF. Если вы чувствуете себя вынужденным делать это (потому что он решает некоторые, казалось бы, непостижимые проблемы с обновлением), что-то не так с кодом и требует немедленного внимания. – kleopatra