|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
21.01.2014, 16:58 | #1 |
Форумчанин
Регистрация: 06.01.2011
Сообщений: 369
|
Оптимизированный поиск в StringList
Здравствуйте.
Пишу программу типа словарь, ориентированную на пользователей, которые изучают английский язык и которым требуется вести свой словарь слов или терминов. В проге реализован производный от TObject класс TBase, который управляет двумя списками строк: один для списка словарей, другой для хранения списка содержимого текущего словаря, каждая строка ("словарная статья") представляет собой пары "термин"="перевод". Для каждого списка на форме имеется свой ListBox в режиме Virtual. Для поиска подходящего термина в списке на форме имеется также один компонент Edit. Требовалось реализовать поиск первого подходящего термина в списке словарных статей. Для этого был создан новый класс TStringListPlus от TStringList, в который добавлен новый метод FindItem поиска номеров строк по содержимому. Код класса приведен ниже: Код:
Пробовал эту процедуру в упомянутой программе на файле размером более 13МБ с более чем 170000 строк - тормозов нет вообще (файл был от словаря QDictionary - там тоже используется хранение статей в виде "термин"="перевод"). Выкладываю сие творение потому, что в инете такого не находил (не скрою - искал не долго), ну и может кому-то пригодится. Также буду рад комментариям.
Программирую по необходимости
|
21.01.2014, 23:01 | #2 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
у TStringList есть метод .Find
Цитата:
Чем Вас этот метод не устроил? |
|
22.01.2014, 11:25 | #3 | ||
Форумчанин
Регистрация: 06.01.2011
Сообщений: 369
|
Цитата:
Цитата:
Программирую по необходимости
|
||
22.01.2014, 11:35 | #4 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Ещё пригодится поиск типа FindNearest - выдать результат даже если точный поиск не удался. Например есть строки 'abcd' и 'abcf', а ищем 'abce', тогда вернуть индекс строки 'abcf', как похожей или точно найденной строки, если есть таковая. Не важно полный поиск или по началу. Ну еще вариант поиска типа LIKE '%та-та-та%', но это уже перебор с начала
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 22.01.2014 в 11:37. |
22.01.2014, 13:42 | #5 | |
Форумчанин
Регистрация: 06.01.2011
Сообщений: 369
|
Цитата:
Программирую по необходимости
|
|
22.01.2014, 13:49 | #6 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
tsar_ , в любом случае правильно сделали, что выложили свой код.
Вполне возможно, он окажется кому-то полезным! |
22.01.2014, 14:22 | #7 |
Форумчанин
Регистрация: 06.01.2011
Сообщений: 369
|
Раз уж разговор зашел за метод Find, попробую сравнить его скорость со скоростью FindItem. Я как-то смотрел исходник модуля с реализацией Find, там если правильно помню реализован поиск обычным перебором (сейчас компилятора нет под рукой).
По результатам отпишусь.
Программирую по необходимости
|
22.01.2014, 14:39 | #8 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
|
22.01.2014, 14:48 | #9 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Да точно также - методом деления пополам
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
23.01.2014, 15:48 | #10 | |
Форумчанин
Регистрация: 06.01.2011
Сообщений: 369
|
Цитата:
Таким образом, FindItem отличается от Find, в первую очередь, функциональностью, ну и немного другой технической реализацией.
Программирую по необходимости
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
оптимизированный код | Madmaxisss | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 6 | 12.08.2012 05:46 |
Поиск и удаление строк в StringList из другово stringlist | SmoK777 | Общие вопросы Delphi | 3 | 06.08.2012 08:21 |
Поиск в Stringlist | Михаил Юрьевич | Общие вопросы Delphi | 3 | 23.07.2012 09:02 |
Поиск и удаление в stringlist'e | bulldog5293 | Общие вопросы Delphi | 20 | 20.10.2011 10:55 |
Поиск в StringList | Gerzs | Общие вопросы Delphi | 1 | 17.01.2010 20:07 |