[Delphi] Вопрос на засыпку #3

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by RedFern.89, 11 May 2010.

  1. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    557
    Likes Received:
    45
    Reputations:
    0
    есть Memo примероного содержания:

    Code:
     Mygarin - Signs of Existence 
     mygrain - W.T.F.
     [color=yellow]Mygarin - Signs of Existence[/color]
     MyGrain - Killing Time 
    [color=yellow] MyGrain - W.T.F.
     MyGrain - W.T.F.[/color]
    
    желтым отмеченны повторяющиеся строчки, подлежащие удалению.

    вопрос! как удалить все одинаковые строчки, оставляя только одну копию? Получится должно типа того:

    Code:
     Mygarin - Signs of Existence 
     mygrain - W.T.F.
     MyGrain - Killing Time 
    
    всем заранее спасибо. Извините за такое ламерство.
     
    #1 RedFern.89, 11 May 2010
    Last edited: 11 May 2010
  2. intNet

    intNet Member

    Joined:
    31 May 2009
    Messages:
    29
    Likes Received:
    14
    Reputations:
    5
    ппц. гугл - не?
    самое простое - через промежуточный TSTringList(есть свойство Duplicates, которому присвоиваешь dupIgnore).
     
  3. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    557
    Likes Received:
    45
    Reputations:
    0
    блин.. у мну моги щас кипят.. ктонить подкинет код?
     
  4. intNet

    intNet Member

    Joined:
    31 May 2009
    Messages:
    29
    Likes Received:
    14
    Reputations:
    5
    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      With TStringList.Create() do
      begin
        Duplicates := dupIgnore;
        Sorted := True;
        AddStrings(Memo1.Lines);
        Memo1.Clear();
        Memo1.Text := Text;
        Free();
      end;
    end;
     
  5. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    557
    Likes Received:
    45
    Reputations:
    0
    спасибо! а без сортировки можно какнить обойтись?
     
  6. Jaw

    Jaw New Member

    Joined:
    12 Apr 2010
    Messages:
    4
    Likes Received:
    1
    Reputations:
    0
    Code:
    var
    i:integer;
    begin
    i:=0;
    while i < form1.Memo1.Lines.Count do
    begin
    if form1.Memo1.Lines.IndexOf(form1.Memo1.Lines[i]) < i then
    form1.Memo1.Lines.Delete(i)
    else
    inc(i);
    end;
    end;
    
     
    1 person likes this.
  7. intNet

    intNet Member

    Joined:
    31 May 2009
    Messages:
    29
    Likes Received:
    14
    Reputations:
    5
    Сортировка не нужна, можешь её убрать.
     
    1 person likes this.
  8. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    557
    Likes Received:
    45
    Reputations:
    0
    всем спасибо! вопрос закрыт..
     
  9. Dizz

    Dizz New Member

    Joined:
    9 May 2010
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Jaw, при большом кол-ве строк этот код оч. долго будет удалять дубли
     
  10. Jaw

    Jaw New Member

    Joined:
    12 Apr 2010
    Messages:
    4
    Likes Received:
    1
    Reputations:
    0
    Dizz, к сожелению или к счастью ты был прав мой код справился с файлом в ~5k строк за 2 минуты, код intNet за считаные милесекунды.
     
  11. 1n0y

    1n0y Active Member

    Joined:
    9 May 2009
    Messages:
    272
    Likes Received:
    276
    Reputations:
    2
    можно еще так: засовываешь текст мемо в стринглист, сортируешь его. далее - сравниваешь первую строку со второй, и если они совпадают - удаляешь вторую. если не совпадают - сравниваешь вторую с третьей. и т.д.
    довольно шустрый метод, чесслово :)
     
  12. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Быстрее делать так, читаем из Memo.Lines.Strings, делаем двойной цикл(проверка текущего со всеми) при этом пишем в другой TStringList, потом Assign в Memo. Скорость обработки будет обратно пропорциональна прогрессу обработки + копирование данных.
     
  13. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    ~5k не показатель попробуйте для интереса 5 миллионов хотябы и этот код должен умереть в плане скорости
     
  14. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    а можно еще так взять двоичное дерево поиска вствлять в него строки после вставки оно уже не содержит дубли
    а за счет дерева и двоичного поиска обработает как минимум 5 миллионов очень быстро про какие то ~5k и говорить не стоит :)
     
  15. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    557
    Likes Received:
    45
    Reputations:
    0
    у меня списки маленькие. Максимуму до 2х к