AGB  ·  Datenschutz  ·  Impressum  







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

Stringliste indexOfName IndexofValue

Ein Thema von bernhard_LA · begonnen am 3. Jan 2020 · letzter Beitrag vom 8. Jan 2020
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Neutral General
Neutral General

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

AW: Stringliste indexOfName IndexofValue

  Alt 3. Jan 2020, 13:53
Values gibt nur den Wert zu einem Key. Damit kriegt man nicht raus ob IRGENDEIN Key einen bestimmten Value hat.
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
bernhard_LA

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

AW: Stringliste indexOfName IndexofValue

  Alt 3. Jan 2020, 14:03
tauschen von Key und Value geht leider nicht muss mich hier an ein festes Ausgabeformat halten,
will halt eine Suche ob ein Substring vorhanden ist vor jedem Einfügen vermeiden, die Listen können sehr lang werden
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Stringliste indexOfName IndexofValue

  Alt 3. Jan 2020, 14:06
Hallo,
Zitat:
muss mich hier an ein festes Ausgabeformat halten
Das mag für die Ausgabe stimmen, aber intern kannst du das doch umdrehen (eigene StringList).

Korrektur
Zitat:
nur dann ein neues Paar "key=value" einfügen, wenn der value nicht schon exitiert.
IndexOf("key=value")=-1 -> existiert noch nicht

Aso die ganz normale Suche benutzen.
Heiko
  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
 
#4

AW: Stringliste indexOfName IndexofValue

  Alt 3. Jan 2020, 14:10
IndexOf("key=value")=-1 -> existiert noch nicht
Funktioniert nicht. Was ist wenn key2=value existiert? Das kannst du damit nicht abfragen.
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
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.739 Beiträge
 
Delphi 6 Enterprise
 
#5

AW: Stringliste indexOfName IndexofValue

  Alt 3. Jan 2020, 14:31
TDictionary verwenden?
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.684 Beiträge
 
Delphi 5 Professional
 
#6

AW: Stringliste indexOfName IndexofValue

  Alt 3. Jan 2020, 14:06
Tja, eine simple Variante ist, eine Kopie der Funktion IndexOfName zu machen und sie zu einem IndexOfValue umzuarbeiten. Ob man das dann als Ableitung von TStrings/TStringList macht oder ob das auch als Helper möglich ist, weiß ich nicht (nie benutzt).

Grüße
Dalai
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.643 Beiträge
 
Delphi 12 Athens
 
#7

AW: Stringliste indexOfName IndexofValue

  Alt 3. Jan 2020, 15:30
Values gibt nur den Wert zu einem Key. Damit kriegt man nicht raus ob IRGENDEIN Key einen bestimmten Value hat.
Du könntest über alle Einträge iterieren und ValueFromIndex prüfen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
bernhard_LA

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

AW: Stringliste indexOfName IndexofValue

  Alt 3. Jan 2020, 16:34
bin jetzt hier gelandet :

Delphi-Quellcode:
Type TStringlistHelper = class helper for TStringlist

           function IndexofValue( ValueStr : string) : Integer;
        
         end;

function TStringlistHelper.IndexofValue ( ValueStr : string) : Integer;
  var i : Integer;
begin
    i := 0;
    repeat
        if ( Pos(ValueStr, self[i])>0 ) then
            begin
              Result := i;
              exit
            end;

        Inc(i);

    until i > Self.Count-1;

    if i > Self.Count-1 then Result := -1;

end;
gibt es bessere / schnellere Lösungen ?
  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
 
#9

AW: Stringliste indexOfName IndexofValue

  Alt 3. Jan 2020, 16:56
gibt es bessere / schnellere Lösungen ?
Ja: ValueFromIndex benutzen statt pos.
Edit: Und eine for-Schleife.. Es sei denn du willst es extra umständlich machen
Edit2:
Delphi-Quellcode:
function TStringlistHelper.IndexofValue(AValueStr : string): Integer;
var i : Integer;
begin
  Result := -1;
  for i:= 0 to Count-1 do
  begin
    if ValueFromIndex[i] = AValueStr then // StrUtils.AnsiSameText ggf falls Case-Insensitiv
    begin
      Result := i;
      break;
    end;
  end;
end;
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."

Geändert von Neutral General ( 3. Jan 2020 um 17:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Stringliste indexOfName IndexofValue

  Alt 8. Jan 2020, 17:11
gibt es bessere / schnellere Lösungen ?
Ja: ValueFromIndex benutzen statt pos.
Der Witz ist, dass dein Code zwar "richtig" funktioniert, im Gegensatz zur ursprünglichen Schleife, da dort das POS irgendwas findet, auch X oder geb in xXx=Ergebnis.
Und der Code ist viel einfacher zu lesen, ist genauso schnell wie das normale IndexOfName,
aber es muß zwangsläufiger langsamer werden, als die einfache Pos-Variante.

Also besser ja, aber schneller ne.

Original wurde im String (ganze Zeile) nur gesucht/verglichen,
während ValueFromIndex erstmal langsam einen neuen String erzeugt (Teil aus Zeile kopiert) und dort dann schneller den ganzen String richtig/vollsändig vergleicht.


Hallo,
Pos('=Value2',StringList.DelimitedText) ?
Das würde aber auch bei einem Eintrag 'Value22' anschlagen.
EndsStr statt Pos wäre hier fast richtiger, aber das würde auch Ergebnis in xXx=abc=Ergebnis finden, obwohl der Wert eigentlich abc=Ergebnis wäre.
Gut, wenn man ausschließt, dass dort ein = drin vorkommt, dann reicht EndsStr aus.
Man müsste also auch noch prüfen, sodass vor dem Gefundenen kein weiteres = vorkommt.

Ansonsten ist die "einfache" Lösung mit ValueFromIndex.


Tipp: eine Zweiphasensuche
Erst schnell mit EndsStr suchen und dann jeden gefundenen Eintrag nochmal "genauer" mit ValueFromIndex nachprüfen,
falls es unbedingt schnell sein muß, auch in einer StringListe.


Schneller geht es sonst nur mit einer Liste, wo Name und Value bereits getrennt in zwei Variablen gespeichert wurden,
am Besten noch, wenn die Liste gehasht und womöglich sogar sortiert wurde.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 8. Jan 2020 um 17:53 Uhr)
  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 13:12 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