Thema: Delphi Array und duplikate

Einzelnen Beitrag anzeigen

Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Array und duplikate

  Alt 6. Mär 2007, 18:29
Du hast es oft leichter, wenn du auf Relikte wie dynamische Arrays und Records verzichtest.

Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}

uses SysUtils, Classes;

type
  TDi = class(TObject)
  private
    FP1: Integer;
    FS1: String;
  public
    constructor Create(S1: String; P1: Integer);
    property S1: String read FS1 write FS1;
    property P1: Integer read FP1 write FP1;
  end;

  TDiArray = class(TList)
  public
    procedure Print;
    function ExtractDuplicates: TDiArray;
  end;

procedure TDiArray.Print;
var I: Integer;
    Item: TDi;
begin
  for I := 0 to Count - 1 do begin
    if (Items[I] <> nil) then begin
      Item := TDi(Items[I]);
      WriteLn(Item.S1 + ' = ' + IntToStr(Item.P1));
    end;
  end;
end;

(************************************
* Annahme: DiArray ist unsortiert. *
* Entspricht im Wesentlichen einem *
* Bubblesort.                      *
************************************)

function TDiArray.ExtractDuplicates: TDiArray;
var I,J: Integer;
begin
  Result := TDiArray.Create;
  for I := 0 to Count - 1 do begin
    if (Items[I] <> nil) then
      for J := I + 1 to Count - 1 do begin
        if (Items[J] <> nil) and
           (TDi(Items[I]).S1 = TDi(Items[J]).S1) then begin
          Result.Add(Items[J]);
          Items[J] := nil;
        end;
      end;
  end;
  //Pack() aufrufen, wenn die "nil"-Löcher entfernt werden sollen.
end;

{ TDi }

constructor TDi.Create(S1: String; P1: Integer);
begin
  inherited Create;
  Self.S1 := S1;
  Self.P1 := P1;
end;

procedure Foo;
var
  Arr, Duplicates: TDiArray;
begin
  Arr := TDiArray.Create;
  Arr.Add(TDi.Create('a', 1));
  Arr.Add(TDi.Create('b', 2));
  Arr.Add(TDi.Create('b', 3));
  Arr.Add(TDi.Create('a', 4));
  Arr.Add(TDi.Create('c', 5));
  Arr.Add(TDi.Create('a', 6));
  Arr.Add(TDi.Create('b', 7));
  Arr.Add(TDi.Create('c', 8));
  Arr.Add(TDi.Create('c', 9));
  Arr.Add(TDi.Create('a', 10));
  Duplicates := Arr.ExtractDuplicates;

  WriteLn('Arr:');
  Arr.Print;
  WriteLn('Duplikate:');
  Duplicates.Print;
  ReadLn;
end;


begin
  Foo;
end.
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat