Registriert seit: 19. Jan 2003
732 Beiträge
Turbo Delphi für Win32
|
Re: Array und duplikate
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
|
|
Zitat
|