AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Duplicate Values in TDictionary

Ein Thema von bernhard_LA · begonnen am 22. Apr 2015 · letzter Beitrag vom 22. Apr 2015
Antwort Antwort
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: Duplicate Values in TDictionary

  Alt 22. Apr 2015, 10:40
Warum die Meldung mit den Duplikaten kommt kann ich dir nicht sagen, aber ein Objekt als Key zu nehmen ist nicht so praktisch. Vor allem kannst du auf die Weise nicht überprüfen ob ein Objekt schon in der Liste enthalten ist.

Denn die Objekte sind nur Pointer (Zahlen) und dieser Pointer ist grob gesagt für jedes Objekt unterschiedlich, selbst wenn die Daten des Objekts identisch sind.
Damit das funktioniert musst du nach EXAKT dem Objekt suchen was du beim Add angegeben hast, nicht einer Kopie mit denselben Werten.
Genau dafür gibt es die Comparer ...
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Duplicate Values in TDictionary

  Alt 22. Apr 2015, 11:01
Problem #1 mit den Duplikaten ist gelöst; Verbleibt die Frage warum er Die Elemente dann nicht in meinem Wörterbuch findet ?


Delphi-Quellcode:
  dict: TDictionary<TElement, TFrequencyList>;
  Myelement: TElement;
  FCount: TFrequencyList;
begin

  dict := TDictionary<TElement, TFrequencyList>.create;

  /// code version #1
  Myelement := TElement.create('maier', 0);
  FCount := TFrequencyList.create(6);
  FCount.data[1] := 99;
  dict.Add(Myelement, FCount);

  /// code version #2
  dict.Add(Telement.create('mueller', 1), TFrequencyList.create(5));

  // Find some key -> hier sollte man nix finden ....
  Myelement := TElement.create('maier', 99);
  if dict.TryGetValue(Myelement, FCount) then
  begin
    ShowMessage('Found it!: ' + IntToStr(FCount.data[1]));
  end;

  /// gibt den hier gibt es doch :-( ????????????????????????
  Myelement := TElement.create('maier', 0);
  if dict.TryGetValue(Myelement, FCount) then
  begin
    ShowMessage('Found it!: ' + IntToStr(FCount.data[1]));
  end;

end;
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Duplicate Values in TDictionary

  Alt 22. Apr 2015, 11:02
Problem #1 mit den Duplikaten ist gelöst; Verbleibt die Frage warum er Die Elemente dann nicht in meinem Wörterbuch findet ?
Dann lies die letzten paar Antworten nochmal. Da steht nämlich sowohl der Grund als auch mindestens eine Lösung dafür drin.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Duplicate Values in TDictionary

  Alt 22. Apr 2015, 11:29
Problem #1 mit den Duplikaten ist gelöst; Verbleibt die Frage warum er Die Elemente dann nicht in meinem Wörterbuch findet ?
Ganz einfach, weil der DefaultComparer für TObject und alle Ableitungen ganz simpel über die Referenz geht.

Und unterschiedliche Instanzen haben auch unterschiedliche Referenzen.

Also musst du dem Dictionary einen Comparer mitgeben, der auf deine gewünschte Gleichheit prüft.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Duplicate Values in TDictionary

  Alt 22. Apr 2015, 14:50
ich habe einen TCustomComparer erstellt, nur bekomme ich einen ABSTRAKTEN Fehler beim Einfügen des zweiten Datensatzes in mein TDictionary



Delphi-Quellcode:
type
  TElement = class
    name: string;
    id: integer;
    value: string;
    constructor create(aname: string; aid: integer);
  end;

  TFrequencyList = class
    data: array of integer;
    constructor create(n: integer);
  end;

  TMyComparer = class(TCustomComparer<TElement>)
    function Compare(const Left, Right: TElement): integer; override;
  end;

type
  TForm1 = class(TForm)
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
var
  dict: TDictionary<TElement, TFrequencyList>;
  Myelement: TElement;
  FCount: TFrequencyList;
begin

  dict := TDictionary<TElement, TFrequencyList>.create( TMyComparer.create) ;

  /// code version #1
  Myelement := TElement.create('maier', 0);
  FCount := TFrequencyList.create(6);
  FCount.data[1] := 99;
  dict.Add(Myelement, FCount);

  /// code version #2
  dict.Add(TElement.create('mueller', 1), TFrequencyList.create(5));

  // Find some key -> sollten nix finden
  Myelement := TElement.create('maier', 99);
  if dict.TryGetValue(Myelement, FCount) then
  begin
    ShowMessage('Found it!: ' + IntToStr(FCount.data[1]));
  end;

  /// gibt es doch :-(
  Myelement := TElement.create('maier', 0);
  if dict.TryGetValue(Myelement, FCount) then
  begin
    ShowMessage('Found it!: ' + IntToStr(FCount.data[1]));
  end;

end;

{ TFrequencyList }

constructor TFrequencyList.create(n: integer);
begin
  setlength(data, n);
end;

{ TElement }

constructor TElement.create(aname: string; aid: integer);
begin
  self.name := aname;
  self.id := aid;
  self.value := 'dummy data';
end;

{ TMyComparer }

function TMyComparer.Compare(const Left, Right: TElement): integer;
begin
     result := Comparetext(left.name, right.name);
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Duplicate Values in TDictionary

  Alt 22. Apr 2015, 14:53
Du musst für deinen Comparer die Methoden Compare,Equals und GetHashCode überschreiben. Nur Compare reicht nicht.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz