Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2010, 15:59   #1
giga_person
Пользователь
 
Регистрация: 02.12.2009
Сообщений: 26
По умолчанию Поиск в Memo уникальной строки (Delphi)

Уважаемые программисты!

В Memo есть строка, которая встречается один раз, все остальные строчки повторяются. Необходимо найти эту одну строку (или иначе - исключить все повторяющиеся).

Код сравнивает первую строчку с остальными, и повторяющиеся заменяет пустой строкой. Первая строчка остаётся. Как продолжить сравнение, т.е. вторая строчка с остальными и т.д., и при этом что бы удалялась оригинальная (первая и т.д. - с которой идёт сравнение) строка?

Код:
 var
   i, x: integer;
begin

 x := 0;
 i := 1;

 repeat
 begin
   if Memo1.Lines[x] = Memo1.Lines[i]
     then Memo1.Lines[i] := '';
 inc(i);

 end;
 until i = 10000;

end;
giga_person вне форума Ответить с цитированием
Старый 21.03.2010, 16:50   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а скажите, важен ли порядок строк?
если использовать метод Memo1.Lines.Sort, то тогда достаточно будет одного прохода, чтобы найти нужную строчку...

а Вашем случае надо делать цикл в цикле (i := x +1; затем цикл по i) и прерывать, если текущую строчку не нашли...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.03.2010, 17:03   #3
giga_person
Пользователь
 
Регистрация: 02.12.2009
Сообщений: 26
По умолчанию

Порядок не важен. А что это за метод Memo1.Lines.Sort?
giga_person вне форума Ответить с цитированием
Старый 21.03.2010, 17:22   #4
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Метода Sort нету у TStrings, он есть только у TStringlist.
Можно конечно измудриться и написать так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 s:tstringlist;
 i:integer;
begin
 s:=TStringlist.Create;
 for i := 0 to memo1.Lines.Count - 1 do
  s.Add(memo1.Lines.Strings[i]);
 s.Sort;
 i:=0;
 while i<s.Count-1 do
 begin
   if s[i]=s[i+1] then
   begin
     s.Delete(i+1);
     s.Delete(i);
   end else
   inc(i);
 end;
 memo1.Clear;
 for I := 0 to s.Count - 1 do
  memo1.Lines.Add(s[i]);
 s.Free;
end;
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 21.03.2010, 17:36   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

russian-stalker, примерно так. правда, я бы не удалял найденные строки, а выходил сразу, как только какая-то строчка не нашлась (ведь нужно найти одну уникальную строчку).

Вот только зачем же строки переносить в цикле?!?!!!!
Код:
  ts := TStringList.Create;
  ts.Text := Memo1.Lines.Text;
  ts.Sort;
  ...
  Memo1.Lines.Text := ts.Text;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.03.2010, 17:38   #6
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Ага, не подумал. Спасибо что исправили.
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 21.03.2010, 17:51   #7
giga_person
Пользователь
 
Регистрация: 02.12.2009
Сообщений: 26
По умолчанию

Serge_Bliznykov и russian-stalker, спасибо!
giga_person вне форума Ответить с цитированием
Старый 21.03.2010, 18:01   #8
Google2010
Форумчанин
 
Регистрация: 16.02.2010
Сообщений: 316
По умолчанию

вот еще как вариант
Код:
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
    y:boolean;
begin
 for I := 0 to memo1.Lines.Count - 1 do
   begin

   y:=false;
   for j := 0 to memo1.Lines.Count - 1 do
      if (i<>j) and (memo1.Lines[i]=memo1.lines[j]) then begin
          y:=true; break;end;
    if not y then break;

   end;
   showmessage(memo1.Lines[i]);
end;
Google2010 вне форума Ответить с цитированием
Старый 21.03.2010, 18:14   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Google2010, ну, если как вариант...

тогда можно чуть оптимизировать:
Код:
   y:=false;
   for j := i+1 to memo1.Lines.Count - 1 do
      if (memo1.Lines[i]=memo1.lines[j]) then begin
          y:=true; break; end;
   if not y then break;
ну и предусмотреть, что такой строки нет, разумеется.

p.s.
>>showmessage(memo1.Lines[i]);
и, кстати, использование переменных цикла (for) ВНЕ цикла небезопасно... лучше использовать дополнительную переменную или заменить цикл for на другой цикл.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.03.2010, 18:17   #10
Google2010
Форумчанин
 
Регистрация: 16.02.2010
Сообщений: 316
По умолчанию

Цитата:
и, кстати, использование переменных цикла (for) ВНЕ цикла небезопасно... лучше использовать дополнительную переменную или заменить цикл for на другой цикл.
дык робит же)))
Google2010 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск в MEMO dimafe6 Общие вопросы Delphi 9 09.02.2010 22:03
memo поиск и перенос строки andrey poki Общие вопросы Delphi 4 22.03.2009 06:54
access+delphi поиск по словам в поле memo gvozdkoff БД в Delphi 2 25.02.2009 07:13
Поиск по Memo photozaz Общие вопросы Delphi 5 25.05.2008 17:55
Поиск в Memo Terran Общие вопросы Delphi 4 07.05.2008 23:33