Einzelnen Beitrag anzeigen

Schokohase
(Gast)

n/a Beiträge
 
#7

AW: Zwei Listen filtern Denkproblem

  Alt 28. Mai 2019, 11:50
Wie gesagt, abstrakt formuliert kommt man auf so etwas
Delphi-Quellcode:
program StadtVerwaltung;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  System.Generics.Defaults,
  System.Generics.Collections;

type
  TArray = class(System.Generics.Collections.TArray)
  public
    class function &Intersect<T>(const A, B: array of T): TArray<T>; overload;
    class function &Intersect<T>(const A, B: array of T; const AComparer: IEqualityComparer<T>): TArray<T>; overload;
  end;

  { TArray }

class function TArray.Intersect<T>(const A, B: array of T; const AComparer: IEqualityComparer<T>): TArray<T>;
var
  vA, vB: T;
begin
  Result := [];
  for vA in A do
  begin
    for vB in B do
    begin
      if AComparer.Equals(vA, vB) then
      begin
        Result := Result + [vA];
        Break;
      end;
    end;
  end;
end;

class function TArray.Intersect<T>(const A, B: array of T): TArray<T>;
begin
  Result := Intersect<T>(A, B, TEqualityComparer<T>.Default);
end;

procedure Main;
var
  A, B, vBArr: TArray<string>;
  idx: Integer;
begin
  A := ['a', 'b', 'c', 'd'];
  B := ['a,b', 'a,e,d'];
  for idx := Low(B) to High(B) do
  begin
    vBArr := B[idx].Split([',']);
    vBArr := TArray.Intersect<string>(vBArr, A);
    B[idx] := String.Join(',', vBArr);
  end;
end;

begin
  try
    { TODO -oUser -cConsole Main : Code hier einfügen }
    Main;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.
PS Ja, ich weiß, dass es sich hier nicht wirklich um die Schnittmenge handelt und somit die Methode anders benannt werden müsste

Geändert von Schokohase (28. Mai 2019 um 11:53 Uhr)
  Mit Zitat antworten Zitat