Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
Хинт ©   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.037 c
9-1102707516
Zak3D[@Tm]
2004-12-10 22:38
2005.03.13
Привязка ко времени ( как это осуществляется )


3-1108144152
Oleg_
2005-02-11 20:49
2005.03.13
как после открытия query указать что некоторое поле вычисляемое?


14-1108294034
QuasiLamo
2005-02-13 14:27
2005.03.13
Обновление окна и рабочего стола


8-1100757230
Centr
2004-11-18 08:53
2005.03.13
куда щелкнул юзер?


14-1109109276
Витос
2005-02-23 00:54
2005.03.13
Dial-Up





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский