13 Stimmen

Welche Delphi-Datenstruktur kann eine Liste von eindeutigen Ganzzahlen enthalten?

Wenn ich Java-Probleme angehe, verwende ich das Sammelmuster. Allerdings ist das in Delphi ein ziemlicher Alptraum, da es kein Integer-Objekt gibt, um die Dinge zu handhaben.

Ich brauche eine Datenstruktur, die Zahlen enthält. Ich möchte in der Lage sein, Zahlen hinzuzufügen, Zahlen zu entfernen und den Inhalt der Sammlung zu überprüfen, und jede Zahl muss eindeutig sein.

Ich bin nicht an einer Lösung interessiert, die ich selbst implementieren und auf Fehler testen muss. Gibt es ein fertiges Objekt wie die HashTable von Java?

22voto

gabr Punkte 26255
uses GpLists;

var
  numberList: TGpIntegerList;
begin
  numberList := TGpIntegerList.Create;
  numberList.Duplicates := dupIgnore;
  numberList.Sorted := true;
  numberList.add(1);
  numberList.add(2);
  numberList.add(3);
  numberList.add(1);

GpListen ist mit einer BSD-Lizenz ausgestattet. Es enthält auch eine Klasse, die 64-Bit-Ganzzahlen enthält - TGpInt64List - und eine Reihe anderer Dinge.

12voto

Barry Kelly Punkte 40566

Dictionary<Integer,Boolean> oder ähnliches.

9voto

splash Punkte 12777

Ich weiß, dass es schmutzig ist, aber man könnte es missbrauchen. TStringList (oder THashedStringList ).

var
  numberList: TStringList;
begin
  numberList := TStringList.Create;
  numberList.Duplicates := dupIgnore;
  numberList.Sorted := true;
  numberList.add(IntToStr(1));
  numberList.add(IntToStr(2));
  numberList.add(IntToStr(3));
  numberList.add(IntToStr(1));
  // numberList.CommaText = '1,2,3'

7voto

Dies ist eine einfache Lösung für die Delphi-Version mit Generika:

TUniqueList<T> = class(TList<T>)
public
  function Add(const Value: T): Integer;
end;

{ TUniqueList<T> }

function TUniqueList<T>.Add(const Value: T): Integer;
begin
  if not Contains(Value) then
    Result := inherited Add(Value);
end;

Und wenn die Leistung mit vielen ganzen Zahlen wichtig ist, dann können Sie die Liste sortiert halten und den binären Suchlauf verwenden

6voto

Delphi-Container-Klassen in der "Standard"-VCL-Bibliothek sind schlecht. Dies ist ein seit langem bestehendes Problem, das in den letzten Versionen nur teilweise korrigiert wurde. Wenn Sie Delphi >= 2009 verwenden, haben Sie generische Klassen, die auch Integer-Datentypen verarbeiten können, bevor Sie Ihre eigene Klasse schreiben, TList auf eine nicht standardisierte Weise verwenden oder eine Bibliothek eines Drittanbieters nutzen müssen. Wenn Sie Zahlen speichern müssen, können Sie sie in einer TList speichern, wenn sie höchstens 32 Bit lang sind, und sie in und aus Zeigern casten. Sie müssen die Methode Add() überschreiben, um die Eindeutigkeit zu gewährleisten. Man könnte auch TBits verwenden und den entsprechenden "Slot" auf true setzen. Andernfalls müssen Sie Bibliotheken von Drittanbietern verwenden, wie die JCL (kostenlos) oder DIContainers (kommerziell), zum Beispiel.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X