![]() |
Array über mit String als "Index"?
hallo zusammen,
ich habe eine große Menge Daten, die ich in ein Array laden will, was z.B. so aussieht: [0]: Name1, 5, 18, 24, 58 [1]: Name2, 4, 32, 55, 23 ... Dabei sind mir die "Namen" jederzeit bekannt und ich würde das Array gerne über die Datensatznamen ansprechen. normal muss ja immer die Zeilennummer des Array angegeben werden. Gibt es da evtl. eine Möglichkeit, das ganze ohne eine Schleife o.ä. zu realisieren? Danke und Gruß Thomas |
AW: Array über mit String als "Index"?
Schau dir mal das Values-Property von TStrings an.
|
AW: Array über mit String als "Index"?
![]() |
AW: Array über mit String als "Index"?
Himitsu hatte ein
![]() Würde aber auch ein TDictionary empfehlen, nachdem du schon XE hast. |
AW: Array über mit String als "Index"?
Mit Tstrings und TDictionary kann man aber nur einem String genau EINEN anderen Sting zuordnen, oder habe ich da jetzt was falsch verstanden?
Ich bräuchte irgendwie sowas, wie eine Datenbank, bei der ich sagen kann, ich will den gesamten Datensatz (bestehend aus mehreren Datenfeldern) mit dem namen "xy". Alternativ könnte ich wohl einfach die Datensätze (also die Zahlen) in ein Array laden und dann TDictionary oder Tstrings nutzen, um den ID's des Arrays die Namen zuzuordnen. Wäre zwar etwas umständlich, aber wie es scheint die einzige Möglichkeit, oder? |
AW: Array über mit String als "Index"?
Und wenn du ein Array of Record machst und dir eine Suchfunktion schreibst, die aus dem Namen den Array-Index sucht. Dann kannst du immer auf den kompletten Datensatz zugreifen. Ist perfomancetechnisch vielleicht nicht das allerschnellste, aber müsste ausreichend sein.
Gruß, Michael |
AW: Array über mit String als "Index"?
vielleicht wäre es gut wenn Du Deine Daten etwas näher beschreiben würdest.
Schon it einer Stringlist und binärer Suche hättest Du eine recht schnelle Möglichkeit für
Code:
Tdictonary kenn ich nicht aber vom Hörensagen ist das a) schneller b) einfacher zu handhaben.
name1 = 1 2 3 4 55 66 77
name2 = 1234 34 12342 2 77 name3 = irgendeinwert Gruß k-H |
AW: Array über mit String als "Index"?
Die Daten bestehen aus:
1.) Datensatzname 2.) 16 einzelnen Hexadezimalzahlen, die auch einzeln ansprechbar sein müssen Bisher hatte ich alles in einem Array und dann mit einer Schleife nach dem gewünschten Datensatznamen gesucht. Aber das ist bei der Anzahl von Daten (ca. 400 Datensätze) schon recht Zeitintensiv. |
AW: Array über mit String als "Index"?
Du kannst sowas:
Delphi-Quellcode:
in ein Array packen und dafür sorgen dass dieses sortiert ist und bleibt. Dann kannst du eine binäre Suche benutzen.
record
Name: String; Values: Array of Byte; end; Zitat:
|
AW: Array über mit String als "Index"?
Zitat:
Zitat:
Gruß K-H |
AW: Array über mit String als "Index"?
Zitat:
Wobei bei der geringen Anzahl der Datensätze die Frage ist, ob man da nicht noch anders herangehen kann. Aber dafür fehlen detailliertere Informationen wie (und wie oft) auf die Daten zugegriffen wird. |
AW: Array über mit String als "Index"?
Zitat:
Delphi-Quellcode:
type
TDatensatz = array[0..15] of Integer; // oder auch 1..16, Byte, Word, String oder was auch immer var Datenbank: TDictionary<string, TDatensatz>; var gibHer: Integer; begin // Zugriff auf Zeile "Name1", Wert 5 gibHer := Datenbank['name1'][5]; end; |
AW: Array über mit String als "Index"?
Zitat:
|
AW: Array über mit String als "Index"?
Nja, wozu eine TStringList misbrauchen, wenn es das Dictionary gibt?
Und dazu noch als Generic, wo man bei der TStingList ständig alles selber (unsicher) casten muß. (abgesehn davon, wenn man alles via AS casten würde) |
AW: Array über mit String als "Index"?
TDictionary gibt es ja nur für neuere Delphi bzw. nicht für das alte Zeugs.
Ich habe nur BDS2006 und muss mir mit einer Hashmap helfen. die hier im Forum rumgeistert. |
AW: Array über mit String als "Index"?
![]() Generics raus und dafür einen festen Typen verwendet ... da sollte es auch locker noch unter D2006 laufen können. |
AW: Array über mit String als "Index"?
Zitat:
|
AW: Array über mit String als "Index"?
Zitat:
Zitat:
|
AW: Array über mit String als "Index"?
Zitat:
Ich für meinen Teil nehme dann doch eher die Autobahn, es sei denn ich bin im Urlaub und will mir Zeit lassen. |
AW: Array über mit String als "Index"?
Der Vergleich hinkt nicht nur, der lahmt. Der Vorteil eines TStringList-Descendants ist die Zuweisungskompatibilität zu Items von Listboxen, Comboboxen u.ä.
|
AW: Array über mit String als "Index"?
Ich finde das passt genau. Eine TStringList ist für den Zweck sowohl beim Programmieren als auch zur Laufzeit langsamer (je nach Anwendung drastisch) und dazu noch umständlicher zu verwenden. Da holperts eben etwas.
|
AW: Array über mit String als "Index"?
Entschuldige, habe nochmal editiert, um zu präzisieren.
Ich habe nur einen einzigen Anwendungsfall, der auf den ersten Blick mit einem Dictionary einfacher lösbar ist, als mit einer TStringList - und das ist eine Optimierung, die ohne Anzeige abläuft und wo nur das ergebnis ausgegeben wird. |
AW: Array über mit String als "Index"?
Zitat:
Ich versuche daas Dictionary gerade so zu füllen: Datenbank.Add('Name1', 12,13,14,16); kann ich das Dictionary so (oder so in der Art) füllen? |
AW: Array über mit String als "Index"?
Mal ein Beispiel (ohne Prüfung, ob der Wert existiert usw.):
Delphi-Quellcode:
type
TExampleData = class Values: array of Integer; constructor Create(const AValues: array of Integer); end; // ... constructor TExampleData.Create(const AValues: array of Integer); var i: Integer; begin SetLength(Values, Length(AValues)); for i := Low(AValues) to High(AValues) do Values[i] := AValues[i]; end; // Verwendung: var Demo: TObjectDictionary<string, TExampleData>; CurrentValue: Integer; CurrentData: TExampleData; begin Demo := TObjectDictionary<string, TExampleData>.Create([doOwnsValues]); try Demo.Add('Test', TExampleData.Create([1, 3, 4, 7])); // einfachen Wert lesen ShowMessage(IntToStr(Demo['Test'].Values[1])); // alle Werte durchgehen for CurrentValue in Demo['Test'].Values do ShowMessage(IntToStr(CurrentValue)); // mehrere Werte zu einem Key lesen CurrentData := Demo['Test']; ShowMessage(IntToStr(CurrentData.Values[1])); ShowMessage(IntToStr(CurrentData.Values[2])); finally Demo.Free; end; end; |
AW: Array über mit String als "Index"?
Warum nicht ein Clientdataset für solche Dinge nehmen? Lässt sich nach jedem Feld sortieren, man kann mit Locate einen Wert suchen, in einem DBGrid darstellen, Laden und Speichern.
|
AW: Array über mit String als "Index"?
Ich verzweifele gerade bei dem Versuch, die Lösung von Uwe Raabe zu füllen
Delphi-Quellcode:
Beim Ausführen der Zeilen zwischen "begin" und "end" bekomme ich immer eine Zugriffsverletzung beim lesen von Adresse 0000000C
type
T_Kennung = array[0..16] of string; public Tabelle: TDictionary<string, T_Kennung>; const Daten: T_Kennung = ('Name1','0x01','0x02','0x03','0x04','0x05','0x06','0x07','0x08','0x09','0x10','0x11','0x12','0x13','0x14','0x15','0x16'); begin Tabelle.Create; Tabelle.Add('Name1', Daten); showmessage (Tabelle['Name'][1]); end; |
AW: Array über mit String als "Index"?
Delphi-Quellcode:
Grüße
Tabelle := TDictionary.create();
Klaus |
AW: Array über mit String als "Index"?
Zitat:
Ich habe die "Generics.Collections" jedoch bei "uses" eingebunden. Habe ich evtl. noch irgendwas übersehen/vergessen? |
AW: Array über mit String als "Index"?
mit TDictionary<string, T_Kennung>.create hats dann endlich geklappt :) Funktioniert so, wie es sollte. Danke!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:54 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