2011-04-28 2 views
0

Я пытаюсь реализовать свой собственный 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 столбцах. Единственная оптимизация, которую я думаю, это добавить объект «Сотрудник» в совпадение первого столбца вместо того, чтобы проходить через остальные столбцы.

Любые предложения по этому вопросу? Большое спасибо за помощь =)

+0

Несвязанный с вашей проблемой, тем не менее важный: никогда не звоните updateUI в код приложения! Он существует для (почти) эксклюзивного использования подключаемого механизма LAF. Если вы чувствуете себя вынужденным делать это (потому что он решает некоторые, казалось бы, непостижимые проблемы с обновлением), что-то не так с кодом и требует немедленного внимания. – kleopatra

ответ

4

Поскольку вы, похоже, ищете то же самое значение во всех полях, я бы просто конкатенировал их и выполнил однократное совпадение.

Кроме того, я не думаю, что есть веская причина, по которой вы должны скомпилировать шаблон на каждой итерации.

+3

. Конкатенацию нужно обрабатывать с осторожностью. Предполагая, что мы имеем значения столбца «abc» и «def» и ищем «cde» - при конкатенации это будет ложным положительным. -> Так что не забудьте вставить разделители, если собираетесь для concat (например, «abc» + «@@» + «def» вместо «abc» + «def») –

+0

Спасибо за помощь всем. И Фредрик, я только что понял, что я поместил Patter.compile внутри своего цикла FOR по ошибке. Спасибо за предупреждение, хотя;) –

+0

@Andreas_D Хороший пункт – Fredrik

0

Просто обновить вас, ребята, по моему вопросу, я, в конце концов, сделал следующее: 1- Сконцентрировано все поля вместе с разделителем между ними («!»). 2- Загрузите библиотеку SearchString по этой ссылке. Johannburkard.de/software/stringsearch 3 - преобразование конкатенированной строки и критерии поиска patten в lowerCase. 4- Использовал алгоритм Boyer Moore, Raita, выполнив следующие действия: BoyerMooreHorspoolRaita searchAl=new BoyerMooreHorspoolRaita();

Затем я сделал следующее: int j=searchAl.searchString(match, search.getText()); if(j!=-1) result.add(e);

Я попытался сравнить первый метод, который я использовал с этим, в таблице, содержащей 100000 записей, и результаты были следующим образом:

шаблона согласование: Первого запуск: 1 символы длиной схема: операция заняла 3.328 секунд, чтобы завершить 2 символов схему: операция заняла 14.14 секунд, чтобы завершить 3-х символов схему: операция заняла 11.328 секунд для заполнения 4 Персонажи длинной картины: Ope Рацион занял 8.437 секунд, чтобы завершить 5 символов схему: операция заняла 8.344 секунд, чтобы завершить 6 символов схемы: операция заняла 8.078 секунд, чтобы завершить

второго запуска: 1 символы длиной шаблон: Операция заняла 3.281 секунд завершить 2 символов схемы: операция заняла 14.14 секунд, чтобы завершить 3-х символов схемы: операция заняла 11.344 секунд, чтобы завершить 4 символов шаблона: Операция приняла 8,375 секунды, чтобы завершить 5 символов схему: операция заняла 8.469 секунд, чтобы завершить 6 Символы длинный узор: Операция принял 8.266 секунд, чтобы завершить

Boyer Moore RAITA: Первый запуск: 1 Характер долго схеме: операция заняла 11.688 секунд, чтобы завершить 2 символов схеме: операция заняла 10.594 секунд, чтобы завершить 3-х символов шаблона: Операция взял 7.563 секунд, чтобы завершить 4 символов схемы: операция заняла 4.328 секунд, чтобы завершить 5 символов схемы: операция заняла 4,5 секунды, чтобы завершить 6 символов схему: операция заняла 4.969 секунд, чтобы завершить

второго запуска: 1 Символ длинный узор: операция заняла 8,172 секунды для завершения 2 Символы длинный узор: операция заняла 8,312 секунды для завершения 3 Символы длинный узор: операция заняла 5,484 секунды, чтобы завершить 4 Символы длинный узор: операция заняла 3,922 секунды для завершения 5 символов длинный узор: операция заняла 3,922 секунды ds для завершения 6 Символы длинной диаграммы: операция заняла 4.047 секунды для завершения

Обратите внимание, что фильтрация шаблонов (первый метод) выполняется быстрее, когда речь идет о единственном совпадении символов. Но Boyer Moore Horspool Raita просто SHINES по мере увеличения длины рисунка.

Я надеюсь, что это кому-то поможет. Cheers.

Смежные вопросы