![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Повторяющиеся строки [D7]
Nianechka © (2010-02-19 22:53:00)Приветствую.
У меня есть два мемо.
Как можно найти в них все одинаковые строчки и добавить эти строчки в 3й мемо?
for i:=0 to Memo1.Lines.Count-1 do
for j:=0 to Memo2.Lines.Count-1 do
if Memo1.Lines.String[i]= Memo2.Lines.String[j] then
Memo3.Lines.Add(Memo1.Lines.String[i]);
Таким обрахом, у меня выходит список совпадающих строчек, но так как сравнивается элемент первый со вторым, а потом второй с первым и так далее, выходит что эти строчки идут несколько раз.
Удалить уже найденную строчку не могу, так как тогда сбивается порядок, и вылетает ошибка, если ее игнорировать, начинает удалять все строчки подряд.
Подскажите как сделать правильно.
Leonid Troyanovsky (2010-02-22 15:36:00) [1]
> Игорь Шевченко © (22.02.10 15:23) [15]
> http://transl-gunsmoker.blogspot.com/2010/02/blog-post_11.html
Вот это, в отличии от, дейс-но, чище, легче и проще опознать :)
--
Regards, LVT.
Игорь Шевченко (2010-02-22 15:23:00) [2]Leonid Troyanovsky © (22.02.10 14:16) [14]
> С большим любопытством почитал бы Реймонда Чена, то,
> что он обещал критиковать после исключений в критсекциях.
>
Это всегда пожалуйста :)
http://transl-gunsmoker.blogspot.com/2010/02/blog-post_11.html
Leonid Troyanovsky (2010-02-22 14:16:00) [3]
> Игорь Шевченко © (21.02.10 03:00) [9]
> Я вроде уже статью Gunsmoker-а про Exceptions с Королевства
> приводил ? :)
Мне она не очень показалась ни с первого взгляда,
ни после внимательного прочтения.
Конечно, материал обработан и обобщен большой,
и все такое прочее (респект автору), но,
для начинающих статья тяжела и содержит
дидактические ошибки, а, как минимум, для меня
не содержит каких-либо откровений.
С большим любопытством почитал бы Реймонда Чена, то,
что он обещал критиковать после исключений в критсекциях.
--
Regards, LVT.
KilkennyCat (2010-02-21 12:27:00) [4]
> Deltas © (20.02.10 03:13) [5]
>
> Для повышения эффективности строки текстовой области лучше
> временно переписать в сортированный список класса TStringList
> и выполнять бинарный поиск с помощью метода TStringList.
> Find().
Поиск лишний, но ход мыслей верный.
Свойство дубликатности спасет.
если только сортировка не противоречит ТЗ.
Nianechka (2010-02-21 11:54:00) [5]Всем большое спасибо, помогли.
Anatoly Podgoretsky (2010-02-21 11:39:00) [6]> Германн (21.02.2010 03:13:10) [10]
А чего разбираться, оба ссылку приводили.
Германн (2010-02-21 03:13:00) [7]
> Игорь Шевченко © (21.02.10 03:00) [9]
>
> Leonid Troyanovsky © (21.02.10 00:03) [7]
>
> Я вроде уже статью Gunsmoker-а про Exceptions с Королевства
> приводил ? :)
>
Так и Леонид недавно приводил ссылку на обсуждение Exception. Вы уж разберитесь, если сможете. :) Нам будет полезно.
Игорь Шевченко (2010-02-21 03:00:00) [8]Leonid Troyanovsky © (21.02.10 00:03) [7]
Я вроде уже статью Gunsmoker-а про Exceptions с Королевства приводил ? :)
Обработка Exceptions занятие а) небыстрое б) неясное
Германн (2010-02-21 02:18:00) [9]
> Leonid Troyanovsky © (21.02.10 00:03) [7]
>
Мне сей вариант понравился.
Хотя задачи мы так и не услышали, а автор сабжа до сих пор не появился тут повторно.
Leonid Troyanovsky (2010-02-21 00:03:00) [10]
> Nianechka (19.02.10 22:53)
procedure TForm1.Button1Click(Sender: TObject);
var
i: Longint;
begin
with TStringList.Create do
try
Sorted := True;
Duplicates := dupError;
AddStrings(Memo1.Lines);
for i := 0 to Memo2.Lines.Count-1 do
try
Add(Memo2.Lines[i]);
except
on E: EStringListError do
Memo3.Lines.Add(Memo2.Lines[i]);
end;
finally
Free;
end;
end;
--
Regards, LVT.
oldman (2010-02-20 08:39:00) [11]
> Таким обрахом, у меня выходит список совпадающих строчек,
> но так как сравнивается элемент первый со вторым, а потом
> второй с первым и так далее, выходит что эти строчки идут
> несколько раз.
> Удалить уже найденную строчку не могу, так как тогда сбивается
> порядок, и вылетает ошибка, если ее игнорировать, начинает
> удалять все строчки подряд.
Перед добавлением проверь наличие строчки в мемо3
:)
лишний цикл, но ошибки не будет.
Deltas (2010-02-20 03:13:00) [12]Для повышения эффективности строки текстовой области лучше временно переписать в сортированный список класса
TStringListи выполнять бинарный поиск с помощью методаTStringList.Find().
Германн (2010-02-20 01:54:00) [13]
> небыстрый способ
>
Да, пожалуй.
Но "быстрость" зависит в большей степени от задачи. А она не озвучена.
Германн (2010-02-20 01:46:00) [14]
> Как можно найти в них все одинаковые строчки и добавить
> эти строчки в 3й мемо?
Если "дубликаты" не нужны, то можно оставить только один цикл. А сравнение заменить на IndexOf.
Игорь Шевченко (2010-02-20 01:46:00) [15]
for I:=0 to Memo1.Lines.Count-1 do
if (Memo2.Lines.IndexOf(Memo1.Lines[I]) <> -1) and
(Memo3.Lines.IndexOf(Memo1.Lines[I]) = -1) then
Memo3.Lines.Add(Memo1.Lines[I]);
небыстрый способ
Германн (2010-02-19 23:54:00) [16]
> Удалить уже найденную строчку не могу, так как тогда сбивается
> порядок, и вылетает ошибка
Используй цикл for downto. Ошибки не будет.