AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Byte-Suche, String-Vergleich mit A>B, A<B und A=B

Byte-Suche, String-Vergleich mit A>B, A<B und A=B

Ein Thema von Schucki · begonnen am 26. Okt 2020 · letzter Beitrag vom 26. Okt 2020
Antwort Antwort
Schucki

Registriert seit: 17. Jul 2004
133 Beiträge
 
Delphi 2010 Architect
 
#1

Byte-Suche, String-Vergleich mit A>B, A<B und A=B

  Alt 26. Okt 2020, 09:43
Hallo,

kann es sein das es Einschränkungen gibt, wenn man zwei Strings mit <, > und = vergleicht?
Ich habe mir eine Routine zur "Byte-Suche in TStringList" geschrieben, wo genau das gemacht wird.

Es werden aber nicht immer die Einträge gefunden, weil der Vergleich manchmal in die falsche Richtung verzweigt, sobald andere Zeichen in den Einträgen vorkommen als Buchstaben und Zahlen. (z.B _,!,# oder ähnlich )

Delphi-Quellcode:
// strlData.Sort = True!
procedure GetKeyStrPositionInList(strKey:string; strlData:TStringList;
                                  var intPosStart:Integer);

var intL,intR: Integer;
    bolFound: Boolean;

begin
  intL := 0;
  intR := Pred(strlData.Count);
  intPosStop := -1;
  bolFound := False;
  while (intL <= intR) and not bolFound do begin
    intPosStart := Round( (intL+intR) / 2);

    strData := UpperCase(CsvCtrl.GetStrFromColumn(0, strlData[intPosList]));
    if strKey < strData then intR := intPosStart - 1;
    if strKey > strData then intL := intPosStart + 1;
    if strKey = strData then bolFound := True;
  end;
  if not bolFound then intPosStart := -1;
end;
Frank

Geändert von Schucki (26. Okt 2020 um 12:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
458 Beiträge
 
#2

AW: Byte-Suche, String-Vergleich mit A>B, A<B und A=B

  Alt 26. Okt 2020, 10:30
Versuch mal AnsiUpperCase anstatt UpperCase.
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
703 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Byte-Suche, String-Vergleich mit A>B, A<B und A=B

  Alt 26. Okt 2020, 11:44
Ich hatte neulich auch Probleme mit sortierten StringListen und Zeichen wie "-". Der Punkt ist wohl, dass Funktionen wie AnsiCompareText standardmäßig etwas mehr machen als erwartet: https://entwickler-ecke.de/viewtopic.php?t=118089
U.a. werden Bindestriche bei der Sortierung damit nicht berücksichtigt.

Probier mal, deine Stringvergleiche (aktuell mit <, >, =) durch AnsiCompareText zu ersetzen. Dann sollte dein Vergleich für die binäre Suche mit dem Vergleich übereinstimmen, der für die Sortierung verwendet wird.
The angels have the phone box.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.972 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Byte-Suche, String-Vergleich mit A>B, A<B und A=B

  Alt 26. Okt 2020, 12:23
  • UpperCase macht nur ASCII, bzw. nur A-Z
  • AnsiUpperCase gibt es alsn ANSI und WIDE (jemand gam auf die kranke Idee, dass die Unicode-Versionen genauso heißen sollen)
    und wie AnsiCompareText oder AnsiSameText beachten die aktuellen Spracheintellungen, sowie CombiningChars (Ä wird wie A+¨ behndelt),
    auch werden je nach Sprache einige Chars anders sortiert. (im Deutschen sind z.B. A und Ä zusammen, obwohl sie Binär weiter entfernt sind)
  • WideUpperCase und WideSameText ist für den WideString und sollte besser nicht für "String" verwendet werden, da sonst die Strings unnötig in einen BSTR umkopiert werden.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Schucki

Registriert seit: 17. Jul 2004
133 Beiträge
 
Delphi 2010 Architect
 
#5

AW: Byte-Suche, String-Vergleich mit A>B, A<B und A=B

  Alt 26. Okt 2020, 12:45
Danke für alle Antworten!

Probier mal, deine Stringvergleiche (aktuell mit <, >, =) durch AnsiCompareText zu ersetzen.
OK das funktioniert wirklich!
Jetzt habe ich in der Beschreibung zu AnsiCompareText gelesen das es "Länderspezifisch" ist. Dachte mir, dann nehme ich doch lieber CompareText aber das funktioniert hingegen wieder nicht!

Wie kann ich nun sicherstellen das eine auf meinem PC sortierte Liste auf ALLEN Systemen gleich sortiert bleibt und die Routine dann auf ALLEN PC's das richtige Ergebnis liefert?

Das mir so eine einfache Sache, mir solche Sorgen bereiten wird, hätte ich auch nicht erwartet.
Frank
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
703 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Byte-Suche, String-Vergleich mit A>B, A<B und A=B

  Alt 26. Okt 2020, 13:28
Wie kann ich nun sicherstellen das eine auf meinem PC sortierte Liste auf ALLEN Systemen gleich sortiert bleibt und die Routine dann auf ALLEN PC's das richtige Ergebnis liefert?
Die Sortier-Methode, die von der Stringlist intern verwendet wird, benutzt AnsiCompareText bzw. AnsiCompareString (je nachdem, ob CaseSensitive gesetzt ist oder nicht). Daher musst du mit deiner Binärsuche auch diese Vergleichsoperation nutzen.

Wenn du die Liste zur Laufzeit sortierst (und nicht z.B. aus einer Textdatei lädst und implizit annimmst, dass sie dann sortiert ist), dann sollte der Code mit AnsiCompareXXX überall funktionieren. Allerdings ist die Sortierung ggf. anders - aber davon merkst du bei der Suche nichts.

Wenn du die Sortierung länderunabhängig immer gleich haben willst, dann musst du deine eigene Sortierfunktion schreiben, bzw. eine eigene Compare-Funktion, die du dann mit CustomSort verwendest. Und diese Compare-Funktion musst du dann auch in der Binärsuche nutzen.
The angels have the phone box.
  Mit Zitat antworten Zitat
Schucki

Registriert seit: 17. Jul 2004
133 Beiträge
 
Delphi 2010 Architect
 
#7

AW: Byte-Suche, String-Vergleich mit A>B, A<B und A=B

  Alt 26. Okt 2020, 14:58
Vielen Dank!
Frank
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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