AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Seltsames Verhalten von IndexOf bei sortierter generischer Liste
Thema durchsuchen
Ansicht
Themen-Optionen

Seltsames Verhalten von IndexOf bei sortierter generischer Liste

Ein Thema von Sir Rufo · begonnen am 22. Feb 2013 · letzter Beitrag vom 22. Feb 2013
Antwort Antwort
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#1

AW: Seltsames Verhalten von IndexOf bei sortierter generischer Liste

  Alt 22. Feb 2013, 07:00
Wenn man sich die Implementierung von
function TList<T>.IndexOf(const Value: T): Integer; anschaut ....
Gegf. könntest Du

Delphi-Quellcode:
function( const L, R : TItem ) : Integer
    begin
      Result := L.Value - R.Value;
    end )
erweitern um einen Vergleich von ID wenn Value identisch ist.....
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#2

AW: Seltsames Verhalten von IndexOf bei sortierter generischer Liste

  Alt 22. Feb 2013, 07:16
Ich habe den Quellcode nicht, aber falls IndexOf iterativ umgesetzt ist, ist das Verhalten doch vollkommen ok.

Deine Ordnungsfunktion ist nicht vollständig implementiert, d.h. es gilt eben nicht: A != B => f(A) != f(B)

Lösung? => Bummi

... fügt man weitere Elemente hinzu, so ist die Liste nicht automatisch sortiert, aber für die Bestimmung des Item-Index wird der Comparer bemüht ...
Wieso erwartest Du, das die Liste automatisch sortiert ist? Das wäre doch performancetechnisch völliger Quark und ist außerdem nicht die Aufgabe einer Liste.

Die Liste ist ein Container für Elemente. Mit der Definition einer Ordnungsrelation ('Comparer') und der Sort-Methode kann eine totale Ordnung hergestellt werden. Nach dem Einfügen eines Elements kann die Ordnung zerstört werden.

Und natürlich muss der Comparer bemüht werden, woher sonst soll die Liste wissen, ob zwei Elemente 'gleich' sind? Das 'gleich' wird ja gerade durch den Comparer definiert.

Was passiert, wenn Du keine Ordnungsrelation angibst? Geht das?
  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
 
#3

AW: Seltsames Verhalten von IndexOf bei sortierter generischer Liste

  Alt 22. Feb 2013, 09:17
... fügt man weitere Elemente hinzu, so ist die Liste nicht automatisch sortiert, aber für die Bestimmung des Item-Index wird der Comparer bemüht ...
Wieso erwartest Du, das die Liste automatisch sortiert ist? Das wäre doch performancetechnisch völliger Quark und ist außerdem nicht die Aufgabe einer Liste.
Ich erwarte doch nicht, dass die Liste sich automatisch selber sortiert. Aber ich erwarte eben von einer Liste, dass ich mit IndexOf den Index des Elements in der Liste bekomme, also
Delphi-Quellcode:
MyIndex := 4;
Assert( MyList.IndexOf( MyList[MyIndex] ) = MyIndex );
Den Comparer habe ich jetzt erweitert zu
Delphi-Quellcode:
  LList := TObjectList<TItem>.Create( TComparer<TItem>.Construct(
        function( const L, R : TItem ) : Integer
    begin
      Result := L.Value - R.Value;
      if Result = 0
      then
        Result := Integer( L ) - Integer( R );
    end ) );
bzw. im originalen Code merke ich mir einfach den Index und der Kas ist gegessen.
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
Furtbichler
(Gast)

n/a Beiträge
 
#4

AW: Seltsames Verhalten von IndexOf bei sortierter generischer Liste

  Alt 22. Feb 2013, 15:03
Aber ich erwarte eben von einer Liste, dass ich mit IndexOf den Index des Elements in der Liste bekomme,
Du wusstest nicht, das der 'Comparer' auch für die Definition von 'Gleichheit' verwendet wird.

Ich halte das für einen Designfehler, und ich glaube, Du auch. Denn ein *TComparer* vergleicht nur und wird für das Sortieren verwendet.

In einer TSortedObjectList (wenn es das gäbe), würde IndexOf (weil mit Binärsuche implementiert) allerdings den Comparer verwendetn. Vielleicht wurde das deshalb so umgesetzt.


Nur mal so: Der Comparer definiert eine Ordnung und man muss sich einfach auch überlegen, wann zwei Objekte gleich, d.h. identisch sind.
Identisch bedeutet auch 'austauschbar', und dann reicht die erste Implementierung eben nicht aus.
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#5

AW: Seltsames Verhalten von IndexOf bei sortierter generischer Liste

  Alt 22. Feb 2013, 17:01
Ich halte das für einen Designfehler, und ich glaube, Du auch. Denn ein *TComparer* vergleicht nur und wird für das Sortieren verwendet.
Ich glaube bei Strings würdest du es wieder nicht für einen Designfehler halten
Den Comperator zu verwenden ist der universellere Ansatz. Eigentlich fehlt dem Ding in diesem Fall ein Rückgabewert für "nicht vergleichbar".

Am wichtigsten ist imho, das so etwas gut dokumentiert ist. Das scheint es nicht zu sein*

* OK, dass ist für viele Bibliotheken wohl ein Wunschtraum. Soll also kein Bashing werden
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.

Geändert von BUG (22. Feb 2013 um 17:04 Uhr)
  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 02:51 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