Thema: Delphi Universelles Array

Einzelnen Beitrag anzeigen

Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.268 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Universelles Array

  Alt 3. Mär 2016, 17:26
Mir sind aber die Funktionen mit den Sets sehr wichtig.
Du willst es eh umbauen, oder?
Ähm Nö. Den Part lasse ich.


Übergibt doch dem Record einfach im Constructor eine Methodenzeiger der aus dem Set's bytes macht und entsprechend der Set-Größe dir die Arrays dynamisch erzeugt...

Oder ruf es direkt so auf

TccArray.Count[SetAtoByte(A1),SetBtoByte(B2)] := 7;
Das war Gedankenübertragung. ja. ich arbeite statt mit Sets einfach mit Arrays.

Die Klasse sieht jetzt so aus:

Delphi-Quellcode:
  TccArray2D<TIndexX, TIndexY> = class
  private
    fCount: TDictionary<TPair<TIndexX, TIndexY>, Integer>;
    fValue: TDictionary<TPair<TIndexX, TIndexY>, Double>;
    function GetCount(aIndexX: TIndexX; aIndexY: TIndexY): Integer;
    function GetValue(aIndexX: TIndexX; aIndexY: TIndexY): Double;
    procedure SetCount(aIndexX: TIndexX; aIndexY: TIndexY; const Value: Integer);
    procedure SetValue(aIndexX: TIndexX; aIndexY: TIndexY; const Value: Double);

    Function IndexPair(aKey: TIndexX; aValue: TIndexY): TPair<TIndexX, TIndexY>;
  public
    constructor Create;
    Destructor Destroy; override;
    Property Count[aIndexX: TIndexX; aIndexY: TIndexY]: Integer read GetCount write SetCount;
    Property Value[aIndexX: TIndexX; aIndexY: TIndexY]: Double read GetValue write SetValue;
    Function Average(aIndexX: TIndexX; aIndexY: TIndexY): Double;
    Function CountSum(aIndexX: array of TIndexX; aIndexY: array of TIndexY): Integer;
    Function ValueSum(aIndexX: array of TIndexX; aIndexY: array of TIndexY): Double;
    Procedure IncCount(aIndexX: TIndexX; aIndexY: TIndexY; aInc: Integer);
    Procedure AddValue(aIndexX: TIndexX; aIndexY: TIndexY; aValue: Double);
  end;
Darin sind zwei TDictionary, welche die Daten aufnehmen. Wer mir nicht so sicher, ob es performant genug ist.

Ein paar Pi-daumen-tests haben ergeben, 32000000 Werte zufügen benötigt ca. 5 Sekunden. Reicht für mich.

Das mit der Funktion, welches die Sets in ein Array wandeln ist ne gute Idee.

Auch kann ich die Klasse einfach erweitern. Einfach in der Ableitung eine Funktion mit den Sets definieren. Darin in Array Wandeln und an die vorhandene Array-Funktion übergeben

Delphi-Quellcode:
  TMyArray = class(TccArray2D<TEnumA, TEnumB>)
  private
  public
    Function CountSumFromSet(IndexA: TEnumASet; IndexB: TEnumBSet): Integer;
  end;
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat