Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.13;
Скачать: CL | DM;

Вниз

Оптимизация функции   Найти похожие ветки 

 
Хинт ©   (2005-02-26 13:25) [0]

Написал функцию для проверки наличия строки в ListBox"е, который хранит имена файлов. Нужна для того, чтобы пользователь не мог добавить один и тот же файл дважды. В списке указано полное имя файла (C:\Temp\music.mp3). В списке в основном присутствуют более 1000 файлов. И проверка каждой новой строки занимает очень много времени.
Как можно оптимизировать функцию?

function TForm1.ExistsInList(Text:string):boolean;
var
i:integer;
begin
Result:=false;
if FListBox.Items.Count=0 then exit;
for i:=0 to FListBox.Items.Count-1 do
       begin
        if Length(Text)=Length(FListBox.Items[i]) then
        if AnsiUpperCase(Text)=AnsiUpperCase(Flistbox.Items[i]) then
               begin
                Result:=true;
                Break;
               end;
       end;
end;


 
Anatoly Podgoretsky ©   (2005-02-26 13:35) [1]

IndexOf


 
XP   (2005-02-26 13:42) [2]

(ListBox.Items.IndexOf(Text) >= 0)
или
(ListBox.Items.IndexOfName(Text) >= 0)


 
Sam Stone ©   (2005-02-26 14:13) [3]

Pos(Text, ListBox.Items.Text)>0


 
TUser ©   (2005-02-26 15:07) [4]

шестая строчка - точно лишняя

Оптимизация - сделать список отсортированным и искать бинарно, за логарифмическое время. Если искать надо часто - то за n*log(n) ты его отсортируешь, а поиск будет быстрым. Если только один раз - наверное, надо при заполнении списка сделать какой-нибудь хеш.


 
Просто Джо ©   (2005-02-26 15:12) [5]

И еще, даже если "в лоб" делать, то запомни, что так делать никогда не нужно:


>  if AnsiUpperCase(Text)=AnsiUpperCase(Flistbox.Items[i])
> then


Зачем каждый раз в цикле считать AnsiUpperCase(Text)? Достаточно один раз это сделать перед циклом, результат сохранить, а после сравнивать уже с ним.


 
Хинт ©   (2005-02-26 17:56) [6]

Всем спасибо. Воспользовался IndexOf.

2Просто Джо
Так тоже делал раньше, но это почти что не влияет на скорость...


 
Просто Джо ©   (2005-02-26 18:08) [7]


> но это почти что не влияет на скорость...


А делать все равно не стоит. Глаз режет.


 
Anatoly Podgoretsky ©   (2005-02-26 18:08) [8]

Sorted и будет сверх-быстро


 
Просто Джо ©   (2005-02-26 22:00) [9]


>  [8] Anatoly Podgoretsky ©   (26.02.05 18:08)
> Sorted и будет сверх-быстро


у TStrings нету Sorted


 
programania ©   (2005-02-26 22:11) [10]

AnsiCompareText должно быть побыстрее
Еще можно сравнивать сначала первый знак строк
это одна команда CPU и если совпало,
то только тогда строки - это
куча команд с вызовом процедур.


 
Anatoly Podgoretsky ©   (2005-02-26 23:27) [11]

Зато у TListBox есть

TCustomListBox.Sorted
Specifies whether the items in a list box are arranged alphabetically.


 
reonid ©   (2005-02-27 01:06) [12]

У TStringList тоже есть Sorted.


 
StarLit   (2005-02-27 01:08) [13]

>Хинт ©   (26.02.05 17:56) [6]
>Всем спасибо. Воспользовался IndexOf.

напиши как сделал , тоже надо сейчас делать...


 
Anatoly Podgoretsky ©   (2005-02-27 10:46) [14]

reonid ©   (27.02.05 01:06) [12]
Да не важно, раз говорит нет, значит нет.

StarLit   (27.02.05 01:08) [13]
А чего там писать одна строчка
if  ListBox1.Items.IndexOf("строка") > -1 then ...


 
Хинт ©   (2005-02-27 10:57) [15]

function TForm1.ExistsInList(Text:string):boolean;
begin
Result:=(FListBox.Items.IndexOf(Text) >= 0);
end;

Всё оказалось намного проще, чем я думал....
А сравнивать, начиная с первого символа нет смысла. Так как в моем случае все строки начинается примерно с "D:\Music\Russian\..."


 
Хинт ©   (2005-02-27 10:57) [16]

function TForm1.ExistsInList(Text:string):boolean;
begin
Result:=(FListBox.Items.IndexOf(Text) >= 0);
end;

Всё оказалось намного проще, чем я думал....
А сравнивать, начиная с первого символа нет смысла. Так как в моем случае все строки начинается примерно с "D:\Music\Russian\..."


 
Просто Джо ©   (2005-02-27 21:10) [17]

[12] reonid ©   (27.02.05 01:06)
В листбоксе Items это TStrings, а не TStringList

[14] Anatoly Podgoretsky ©   (27.02.05 10:46)
Задача поставлена так, что не ясно, можно ли сортировать визуальный список листбокса. Может, это плейлист какой-нибудь, и в нем как-раз строки должны быть не отсортированы, а находится в том порядке, в каком их расположит пользователь.


 
Anatoly Podgoretsky ©   (2005-02-27 21:12) [18]

Просто Джо ©   (27.02.05 21:10) [17]
В списке указано полное имя файла (C:\Temp\music.mp3).


 
Просто Джо ©   (2005-02-27 21:21) [19]


>  [18] Anatoly Podgoretsky ©   (27.02.05 21:12)
> Просто Джо ©   (27.02.05 21:10) [17]
> В списке указано полное имя файла (C:\Temp\music.mp3).


Ну, мало ли... Впрочем, похоже, что автор уже "оптимизировал" ([15]). Видимо, это был верх оптимизаторства. Никогда не знаешь, что человеку нужно.



Страницы: 1 вся ветка

Текущий архив: 2005.03.13;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.029 c
3-1108030793
Aleksandr.
2005-02-10 13:19
2005.03.13
Что будет быстрее?


3-1108107634
Mishenka
2005-02-11 10:40
2005.03.13
В поле какого типа лучше всего загружать Gif файлы?


4-1107250280
ALex01
2005-02-01 12:31
2005.03.13
Excel и Word


1-1109604044
hgd
2005-02-28 18:20
2005.03.13
Функция playsound


4-1107193510
Artin
2005-01-31 20:45
2005.03.13
Как отключить Drag&Drop? Читал Windows SDK нащёл функцию ...