AGB  ·  Datenschutz  ·  Impressum  







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

TObjectlst - Index eines Objektes finden

Ein Thema von scrat1979 · begonnen am 14. Feb 2010 · letzter Beitrag vom 17. Feb 2010
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#1

TObjectlst - Index eines Objektes finden

  Alt 14. Feb 2010, 21:34
Folgendes Problem: Ich möchte in einer TObjectList mehrere GLEICHARTIGE Objekte verwalten. Sagen wir mal, die Objekte haben z.B. alle eine "property ID : Integer...". Nun möchte ich beispielsweise den Index in der ObjectList von demjenigen Objekt herausfinden, welches die ID 37 hat. Eine entsprechende Methode habe ich leider nicht finden können, IMHO bleibt nur noch übrig, die ObjectList mittels Schleife zu durchlaufen und jedes Objekt auf die Eigenschaft ID=37 prüfen. Bei einem Treffer wäre der aktuelle Zähler der Index. Gibt es hierfür eine einfachere Lösung?

SCRaT
Michael Kübler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

Re: TObjectlst - Index eines Objektes finden

  Alt 14. Feb 2010, 21:45
Zitat von scrat1979:
IMHO bleibt nur noch übrig, die ObjectList mittels Schleife zu durchlaufen und jedes Objekt auf die Eigenschaft ID=37 prüfen. Bei einem Treffer wäre der aktuelle Zähler der Index. Gibt es hierfür eine einfachere Lösung?
Nee, das is so schon der gängige Lösungsweg.

Nur wenn die Objekte nach ihren IDs sortiert sind, dann könnte man die Suche noch optimieren.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: TObjectlst - Index eines Objektes finden

  Alt 14. Feb 2010, 22:00
Danke!! Wollte nur nicht das Rad neu erfinden Dann mach ich es wohl so...
Michael Kübler
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#4

Re: TObjectlst - Index eines Objektes finden

  Alt 14. Feb 2010, 22:20
Hallo Michael,

du könntest auch eine TStringList nehmen und dort zu den Objekten die ID als String hinterlegen. Die Suche über IndexOf() sollte speziell bei einer größeren Anzahl von Objekten relativ schnell gehen, sofern die Stringliste sortiert ist. Bei neueren Delphi-Versionen verfügt die Stringliste übrigens auch über die Eigenschaft OwnsObjects und kann somit die enthaltenen Objekte freigeben.

Abhängig von der Anzahl der Objekte lohnt der Aufwand eventuell gar nicht, und du bist mit einer einfachen Suchschleife schneller.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: TObjectlst - Index eines Objektes finden

  Alt 14. Feb 2010, 22:49
Das habe ich auch im Sinn gehabt, muss mal schauen, welche von beiden Lösungen in meinem Fall am praktikabelsten ist. Danke trotzdem für den Tip!
Michael Kübler
  Mit Zitat antworten Zitat
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#6

Re: TObjectlst - Index eines Objektes finden

  Alt 15. Feb 2010, 00:35
Warum nicht die Vorteile von Delphi 2010 nutzen, wenn es schon verfügbar ist. (Geht grundsätzlich auch ohne Generika.)
Delphi-Quellcode:
program Project1;

{$AppType Console}

uses
  SysUtils,
  Generics.Collections,
  Generics.Defaults;

type
  TMyObject = class
    strict private
    FValue: Integer;

    public
    property Value: Integer read FValue write FValue;
  end;

  TMyComparer = class(TComparer<TMyObject>, IComparer<TMyObject>)
    function Compare(const Left, Right: TMyObject): Integer;
  end;

  TMyObjectList = class(TObjectList<TMyObject>)
    public
    constructor Create;
    function IndexOfValue(const Value: Integer): Integer;
  end;

{ TMyComparer }

function TMyComparer.Compare(const Left, Right: TMyObject): Integer;
begin
  Result := Left.Value - Right.Value;
end;

{ TMyObjectList }

constructor TMyObjectList.Create;
begin
  inherited Create(TMyComparer.Create);
end;

function TMyObjectList.IndexOfValue(const Value: Integer): Integer;
var
  Temp: TMyObject;
begin
  Temp := TMyObject.Create;
  try
    Temp.Value := Value;
    Result := IndexOf(Temp);
  finally
    Temp.Free;
  end;
end;

{ Hauptprogramm }

var
  MyObjectList: TMyObjectList;
  MyObject: TMyObject;
  Index: Integer;
begin
  try
    MyObjectList := TMyObjectList.Create;
    try
      for Index := 9 downto 0 do
      begin
        MyObject := TMyObject.Create;
        MyObject.Value := Index;
        MyObjectList.Add(MyObject);
      end;

      for Index := -1 to 10 do
        WriteLn(Format(
          'MyObjectList.IndexOfValue(%3d) = %3d',
          [Index, MyObjectList.IndexOfValue(Index)]
        ));

      ReadLn;
    finally
      MyObjectList.Free;
    end;
  except
    on E: Exception do
      WriteLn(E.ClassName, ': ', E.Message);
  end;
end.
Code:
MyObjectList.IndexOfValue( -1) = -1
MyObjectList.IndexOfValue(  0) =  9
MyObjectList.IndexOfValue(  1) =  8
MyObjectList.IndexOfValue(  2) =  7
MyObjectList.IndexOfValue(  3) =  6
MyObjectList.IndexOfValue(  4) =  5
MyObjectList.IndexOfValue(  5) =  4
MyObjectList.IndexOfValue(  6) =  3
MyObjectList.IndexOfValue(  7) =  2
MyObjectList.IndexOfValue(  8) =  1
MyObjectList.IndexOfValue(  9) =  0
MyObjectList.IndexOfValue( 10) = -1
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: TObjectlst - Index eines Objektes finden

  Alt 15. Feb 2010, 06:25
Habe zwar noch nie mit Generics zu tun gehabt, werde ich mir aber auf jeden Fall mal anschauen!!!!

Danke für den Code!!!

SCRaT
Michael Kübler
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: TObjectlst - Index eines Objektes finden

  Alt 15. Feb 2010, 07:19
Zitat von himitsu:
Nur wenn die Objekte nach ihren IDs sortiert sind, dann könnte man die Suche noch optimieren.
Nö, einfach die IDs in eine Hashmap und die Referenz als Nutzdaten: Wupps, ist man optimal schnell.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

Re: TObjectlst - Index eines Objektes finden

  Alt 15. Feb 2010, 07:46
Zitat von alzaimar:
Nö, einfach die IDs in eine Hashmap und die Referenz als Nutzdaten: Wupps, ist man optimal schnell.
Dann muß doch aber dennoch die ganze Map durchsucht werden?
Es sei denn man sortiert diese Map, bzw. bereitet sie aufandere Weise, zu besseren Suche, auf.

Aber die Suche nach Integer oder Hash ist doch eigentlich keinen großen Unterschied?
$2B or not $2B
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: TObjectlst - Index eines Objektes finden

  Alt 16. Feb 2010, 19:45
Zitat von himitsu:
Dann muß doch aber dennoch die ganze Map durchsucht werden?
Auch wieder 'nö'. Suchen in einer Hashmap geht in O(1).

Ich glaub, hier ist auch eine 'Integer-Hashmap' dabei. Da kannst Du dir mal anschauen, wie das geht.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 22:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz