Более быстрый алгоритм поиска в JTable - PullRequest
0 голосов
/ 28 апреля 2011

Я пытаюсь реализовать свой собственный JTable RowFilter, так как я использую Java 1.4 (RowFilter, кажется, не существует в этой версии).Однако я все еще считаю, что алгоритм, который я использую, можно заменить гораздо более быстрым.Я попробовал свой алгоритм на фиктивной таблице, которая содержит 30 000 записей и 8 столбцов, и я получаю результат менее чем за секунду.Но иногда есть небольшая задержка, возникающая при вводе в Критерии поиска (в основном это JTextField с DocumentListener).Вот алгоритм, который я использую:

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

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

Ответы [ 2 ]

4 голосов
/ 28 апреля 2011

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

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

0 голосов
/ 29 апреля 2011

Просто, чтобы проинформировать вас, ребята, по моему вопросу, я, наконец, сделал следующее: 1- объединил все поля вместе с разделителем между ними ("!") 2- скачал библиотеку SearchString по этой ссылке johannburkard.de/software / stringsearch 3 - преобразовал составную строку и шаблон поиска patten в lowerCase.4. Использовал алгоритм Бойера-Мура, Раиты, выполнив следующее: BoyerMooreHorspoolRaita searchAl=new BoyerMooreHorspoolRaita();</p> <p> Затем я сделал это: int j=searchAl.searchString(match, search.getText()); if(j!=-1) result.add(e);

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

Сопоставление с образцом: ПЕРВЫЙ ВЫПОЛНЕНИЕ: 1 Шаблон длинного символа: операция заняла 3,328 секунды для завершения Шаблон длиной 2 символа: операция заняла 14,14 секунды для завершения 3Шаблон длинных символов: для выполнения операции потребовалось 11,328 секунд Шаблон длинных символов: для завершения операции потребовалось 8,437 секунды Шаблон длинных символов: для завершения операции потребовалось 8,344 секунды. Шаблон длиной 6 символов: для завершения операции

* потребовалось 8,078 секунд.1011 * ВТОРОЙ ЗАПУСК: 1 Шаблон длиной символа: Операция заняла 3,281 секунды для завершения Шаблон длиной 2 символа: Операция заняла 14,14 секунды для завершения Шаблон длиной 3 символа: Операция заняла 11,344 секунды для завершения Шаблон длиной 4 символа: Операция заняла 8,375 секундыs, чтобы завершить шаблон длиной 5 символов: операция заняла 8.469 секунд для завершения шаблон длиной 6 символов: операция заняла 8.266 секунд для завершения

Бойер Мур РАИТА: ПЕРВЫЙ ВЫПОЛНЕНИЕ: 1 шаблон длиной символа: операцияДля завершения шаблона длиной 2 символа потребовалось 11,688 секунд. Для завершения шаблона длиной 3 символа: операция длилась 10,594 секунд. Для завершения шаблона длиной в 4 763 операции: шаблон длился 4,328 секунды. Для завершения шаблона длиной в 5 символов: операция заняла 4,5 секунды.Шаблон длинных символов: для выполнения операции потребовалось 4,996 секунды

ВТОРОЙ ЗАПУСК: 1 Шаблон длинного символа: для выполнения операции потребовалось 8,172 секунды. Шаблон длиной 2 символа: для выполнения операции потребовалось 8,312 секундышаблон: Операция заняла 5,484 секунды для завершения 4 символа. Шаблон: операция заняла 3,922 секунды для завершения. 5 символов шаблон: Операция заняла 3,922 секунды для завершения 6 символов. lШаблон ong: Операция заняла 4,047 секунды для завершения

Обратите внимание, что фильтрация по шаблонам (первый метод) выполняется быстрее, когда речь идет о сопоставлении одного символа.Но Бойер Мур Хорспул Раита просто светит, поскольку длина паттерна увеличивается.

Надеюсь, это кому-нибудь как-нибудь поможет.Приветствия.

...