Здравствуйте, Гость
Воскресенье, 22.10.2017, 23:24
Главная Главная страница форума Регистрация Вход
Новые сообщения Участники форума Правила форума Поиск
Страница 1 из 11
Модератор форума: stalker, Ekz 
Форум » Все о Delphi » Начинающим » Отсеять похожие строки
Отсеять похожие строки
gromdronДата: Пятница, 02.07.2010, 13:59 | Сообщение # 1
Ранг 1
Группа: Проверенные
Сообщений: 12
Награды: 0
Репутация: 0
Статус: Offline
Есть поле Memo1 в котором содержится SpinEdit1 строк. В каждой строке 1 слово. Нужно найти похожие слова и удалить.
Т.е. в поле Memo1 попали слова:

Карась
Утра
Яблоко
Яблоко
Зелень
Щи
Карась

А после алгоритма, список должен отсеять повторяющиеся имена и выглядеть так:

Карась
Утра
Яблоко
Зелень
Щи

Что-то немогу понять какая ошибка в алгоритме:

Code
For i:=1 to Memo1.Lines.Count do
begin
k:=0;
s:=Memo1.Lines[i];
For j:=1 to Memo1.Lines.Count do
begin
c:=Memo1.Lines[j];
If k>1 then Memo1.Lines.Delete(j);
If s=c then k:=k+1;
end;
end;
end;

,где
s - string, строки которую сравнивают
c - string, которая сравнивается с s
k - integer, переменная считающая количество повторяющихся строк
i,j - integer, счетчики

Приведенный алгоритм почему-то не работает при большом количестве строк (например 1000).
Интересует работающий алгоритм(!) и максимально эффективный по времени.
Помогите, если кто знает или сталкивался с подобной проблемой.

Сообщение отредактировал gromdron - Пятница, 02.07.2010, 14:00
 
AdminДата: Пятница, 02.07.2010, 18:12 | Сообщение # 2
Ранг 10
Группа: Пользователи
Сообщений: 1268
Награды: 16
Репутация: 2
Статус: Offline
Думаю тут две ошибки.
1. При удалении элемента j, строки смещаются, т.е. Смотрели мы 3-ий элемент. Решили его удалить. Четвертый стал на его место. Следующим шагом мы смотрим 4-ый элемент (j=4), но на его месте оказывается пятый элемент следовательно четвертый пропускаем. Какой выход? Результат копировать в другую переменную.

2. Count - количество элементов.

Code
Строка 0
Строка 1
Строка 2

Тут элементов 3 штуки. Т.е. Count = 3. Но если обращаться к Memo1.Lines[j], то максимальное значение j будет 2, так как нумерация с нуля.

Выход:

Code
For j:=1 to Memo1.Lines.Count-1 do


Не оказываю помощь через личные сообщения и ICQ
 
XakerДата: Пятница, 02.07.2010, 19:05 | Сообщение # 3
Ранг 4
Группа: Проверенные
Сообщений: 83
Награды: 1
Репутация: 0
Статус: Offline
Quote (gromdron)
Приведенный алгоритм почему-то не работает при большом количестве строк (например 1000).

скорее вы просто не видите как он работает...поэтому при большом кол-ве можно юзать... Application.ProcessMessages

 
AdminДата: Пятница, 02.07.2010, 21:03 | Сообщение # 4
Ранг 10
Группа: Пользователи
Сообщений: 1268
Награды: 16
Репутация: 2
Статус: Offline
Странно, а почему он работает? Я мельком осмотрел код, и нашел две ошибки, сильно в суть не вникал.

Не оказываю помощь через личные сообщения и ICQ
 
gromdronДата: Пятница, 02.07.2010, 21:09 | Сообщение # 5
Ранг 1
Группа: Проверенные
Сообщений: 12
Награды: 0
Репутация: 0
Статус: Offline
Спасибо, очень помогло. Особенно с нумерацией (почему-то считал что вся нумерация в полях типа Memo начинается с 1)
 
AdminДата: Пятница, 02.07.2010, 21:27 | Сообщение # 6
Ранг 10
Группа: Пользователи
Сообщений: 1268
Награды: 16
Репутация: 2
Статус: Offline
gromdron, единственная нумерация, что я знаю, которая начинается с 1 это нумерация символов в строке.

Не оказываю помощь через личные сообщения и ICQ
 
gromdronДата: Пятница, 02.07.2010, 22:10 | Сообщение # 7
Ранг 1
Группа: Проверенные
Сообщений: 12
Награды: 0
Репутация: 0
Статус: Offline
Спасибо за информацию. Буду знать.
 
XakerДата: Воскресенье, 04.07.2010, 20:19 | Сообщение # 8
Ранг 4
Группа: Проверенные
Сообщений: 83
Награды: 1
Репутация: 0
Статус: Offline
Admin, ну это после исправления ошибок)
 
Форум » Все о Delphi » Начинающим » Отсеять похожие строки
Страница 1 из 11
Поиск:

Copyright DelphiDevelop.ru © 2008-2017
Хостинг от uCoz