Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удалить одинаковые строки из listbox


Xper ©   (2002-07-19 23:40:00) 

В listbox есть список строк:
r123
r456
r789
r123
r098
r456
Так вот, нужно найти одинаковые строки и удалить их! В данном случае это строки: r123, r456. Я очень начинающий Делфист. По-разному пробовал и никак не получается решить мою проблему. Помогите пожалуйста исходником.


ipLenin   (2002-07-23 11:39:00) [1]

А не легче добавлять сначала строки не listbox, а в TStringList, у которого установить свойство Duplicates = dupError.
Теперь если добавляется повторное значение в TStringList, то будет генериться ошибка. Соответственно если ошибки нет, то эту строку можно добавлять в listbox, так как ее там еще нет.
И все. Не надо никаких сортировок массивов или переборов.


Xper   (2002-07-20 13:31:00) [2]

Спасибо, Proton! Этот алгоритм работает и соответсвенно меня устраивает. Спасибо еще раз.


Proton   (2002-07-20 12:19:00) [3]

2MrBeer
да ну вас
не нравится не пользуйтесь
от мигания можно избавтся отключив обновление
ListBox1.Items.BeginUpdate
и
ListBox1.Items.EndUpdate
я лично предпочитаю короткий код нежели супер быстрому решению в три листа
5000 строк мой код даже на самом медленном тормозе обработает так что юзер даже не заметит
если же надо с большими обемами информации работать то данные ни один стоящий програмист в лист

боксе хранить не станет, а вотстольуется базой данных - а там это выборка решается простым SQL

запросом.
Ps пить надо меньше
PPS нерод идет на форум в первую очерендь за готовым решением, а не за советами (иногда

бесполезными)
PPPS если есть возможность попробуйте писать все таки на русском, а то маразам каккойто одно

слово русское, второе английское
2Xper
не забудьте про использование AnsiUPperCase и TRIM - может помочь

в предложении MrBeer есть свой смысл - сортируеш его по примеру quicksort и идеш по списку
1) если предыдущая запись равна текущей - значить удаляем текущую
2) если нет то переходим на след запись


MrBeer   (2002-07-20 06:26:00) [4]

Algoritm v principe rabotajuschii no estj nekotorie zamechania -
1) Podobnaya realizacia mozhet vizvatj flicker na medlennih mashinah, sootv zhelatelno zablokriovatj update na ekrane vo vremya izmenenii.
2) Daleko ot optmalnogo - O(N^2) esli ne oshibajusj, esli primenitj soritirovku (naprimer shell ili quicksort) i potom vikdivatj odinakovie elementi eto uzhe blizke k O(N Log N).

best regards.


Proton   (2002-07-20 04:31:00) [5]

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
i:=0;
with ListBox1,items do
while i<count do
if IndexOf(items[i])<i then
delete(i)
else
inc(i);
end;
PS не забудь проверить удалается ли первые и последние строки


Viewer   (2002-07-20 00:35:00) [6]

Лучше их не вставлять, т.е. на этапе добавления отсекать.


Наверх

Титульная страница Поиск, карта сайта Написать письмо