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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.09.2010, 06:14   #1
gamer123
Пользователь
 
Регистрация: 19.01.2008
Сообщений: 92
По умолчанию Удалить дубли по началу строки

Добрый день. Не могу даже алгоритм придумать, как удалить дубли. Есть мемо, там список линков вида

site1.ru/index.php?id=2
site1.ru/index.php?id=1
site1.ru/news.php?id=1
site3.ru/index.php?id=1
site1.ru/news.php?id=4
site1.ru/news.php?id=3

нужно удалить дубли по домену, т.е оставить 1 линк (то что после index.php или news.php сверять ненужно, без разницы что там) site1.ru/news.php?id=1 и site1.ru/news.php?id=1 (сверка на дубли идет по домену и 1му файлу, т.е
site1.ru/index.php).

из этого
site1.ru/index.php?id=2
site1.ru/index.php?id=1
site1.ru/news.php?id=1
site3.ru/index.php?id=1
site1.ru/news.php?id=4
site1.ru/news.php?id=3

должно остаться

site1.ru/index.php?id=2 или site1.ru/index.php?id=1 (без разницы)
site1.ru/news.php?id=1 или site1.ru/news.php?id=4 или site1.ru/news.php?id=3
site3.ru/index.php?id=1

Последний раз редактировалось gamer123; 01.09.2010 в 06:17.
gamer123 вне форума Ответить с цитированием
Старый 01.09.2010, 08:46   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не особо проверял но что-то в этом роде:
Код:
var e,k,i:integer; s:string;
begin
 e:=0;
 for i:=Memo1.Lines.Count-1 downto 0 do begin
   s:=copy(Memo1.Lines[i],1,pos('?',Memo1.Lines[i]));
   k:=Memo1.Perform(LB_FINDSTRING,e,integer(pchar(s)));
    if k<>LB_ERR then
       Memo1.Lines.Delete(e);
   inc(e);
 end;
   s:=copy(Memo1.Lines[0],1,pos('?',Memo1.Lines[0]));
   k:=Memo1.Perform(LB_FINDSTRING,1,integer(pchar(s)));
    if k<>LB_ERR then
       Memo1.Lines.Delete(0);
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.09.2010, 09:22   #3
gamer123
Пользователь
 
Регистрация: 19.01.2008
Сообщений: 92
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Не особо проверял но что-то в этом роде:
Код:
var e,k,i:integer; s:string;
begin
 e:=0;
 for i:=Memo1.Lines.Count-1 downto 0 do begin
   s:=copy(Memo1.Lines[i],1,pos('?',Memo1.Lines[i]));
   k:=Memo1.Perform(LB_FINDSTRING,e,integer(pchar(s)));
    if k<>LB_ERR then
       Memo1.Lines.Delete(e);
   inc(e);
 end;
   s:=copy(Memo1.Lines[0],1,pos('?',Memo1.Lines[0]));
   k:=Memo1.Perform(LB_FINDSTRING,1,integer(pchar(s)));
    if k<>LB_ERR then
       Memo1.Lines.Delete(0);
end;
Жму кнопку, полсписка чистит, еще раз жму - еще список урезает, 3й раз жму - уже одлинарные ссылки удаляет, 4й раз - весь список очищает. В чем может быть проблема?
gamer123 вне форума Ответить с цитированием
Старый 01.09.2010, 09:56   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
В чем может быть проблема?
Я с потолка писал. особо не проверял.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.09.2010, 10:34   #5
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Вот, работает как нужно
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    procedure DelDuplicat(Inp: TStrings);
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.DelDuplicat(Inp: TStrings);
var
  I,J,II :Integer;
  Buf0,Buf1 :string;
begin // поиск и удаление дубликатов файлов
 if Inp=nil then Exit;
 if Inp.Count <= 0 then Exit;
  // чистим список
 Inp.BeginUpdate;
  try
 for I:=Inp.Count-1 DownTo 0 Do
 begin
    // строка для сравнения
   Buf0 := AnsiUpperCase(Inp.Strings[I]);
    // берём название домена
   if Pos('/', Buf0) > 0 then
    Buf0 := Copy(Buf0, 1, Pos('/', Buf0)-1);
     // ищим похожие строки
    for J:=I-1 Downto 0 do
    begin
     Buf1 := AnsiUpperCase(Inp.Strings[J]);
      // проверка совпадения
     if Pos(Buf0, Buf1) > 0 then
     begin
      Inp.Delete(J);
     end;
    end;
 end;
  finally
 Inp.EndUpdate;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Button1.Enabled := False;
  try
 DelDuplicat(Memo1.Lines);
  finally
 Button1.Enabled := True;
  end;
end;

end.
Вложения
Тип файла: rar Удаление дубликатов в TStrings.rar (5.0 Кб, 13 просмотров)
Alter вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удалить дубли в tstringlist, и удалить по списку AHTOLLlKA Компоненты Delphi 2 17.01.2010 10:20
Удалить строки из RichEdit спаситепомогите Помощь студентам 1 08.08.2009 03:00
Удалить определенные строки DBGrid Serval Помощь студентам 2 08.05.2009 08:20
Как удалить слово из строки? Ellita Общие вопросы C/C++ 7 19.09.2007 15:43
удалить похожие строки ZORRO2005 Microsoft Office Excel 0 28.11.2006 22:03