Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Numerische höchster Stringwert (https://www.delphipraxis.net/211914-numerische-hoechster-stringwert.html)

creehawk 21. Nov 2022 10:15

Numerische höchster Stringwert
 
Eine Stringliste von Dateinamen, die via

Delphi-Quellcode:
  FileList := TSTringlist.create;
  begin
    if FindFirst(DERPath + '*.*', faAnyFile, SR) = 0 then
    begin
      repeat
        if (SR.Attr <> faDirectory) then
        begin
         FileList.Add(SR.Name);
        end;
      until FindNext(SR) <> 0;
      FindClose(SR);
    end;
  end;
bringt das FileList.text Ergebnis:
Code:
  sgm1.der
  sgm11.der
  sgm12.der
  sgm17.der
  sgm22.der
  sgm25.der
  sgm3.der
  sgm4.der
  sgm9.der
Ich brauche die numerisch höchsten Dateinamen, was in dieser Liste die «sgm25.der» wäre. Wir kriege ich die?

creehawk

Der schöne Günther 21. Nov 2022 10:20

AW: Numerische höchster Stringwert
 
  1. Übung: Extrahiere die Zahl (Integer) aus dem String
  2. Mache aus der String-Liste ein Zahlen-Array
  3. Sortiere das Array absteigend
  4. Gebe den Wert von
    Delphi-Quellcode:
    meineZahlen[0]
    zurück

Wobei genau klemmt es?

Jumpy 21. Nov 2022 10:22

AW: Numerische höchster Stringwert
 
Heißen die Dateien immer so sgmX.der?

creehawk 21. Nov 2022 10:38

AW: Numerische höchster Stringwert
 
@Der schöne Günther

Okay, versteh ich natürlich, ich dachte es gibt was "Eingebautes".....:|

@jumpy

Ja die Dateien heißen immer so, ist in Messwerte Format.

creehawk

haentschman 21. Nov 2022 11:06

AW: Numerische höchster Stringwert
 
Zitat:

ich dachte es gibt was "Eingebautes
Jo...regex. 8-)

Beispiele:
https://www.google.de/search?q=regex...client=gws-wiz

Uwe Raabe 21. Nov 2022 12:02

AW: Numerische höchster Stringwert
 
Warun 25 und nicht 91?

creehawk 21. Nov 2022 14:11

AW: Numerische höchster Stringwert
 
@Uwe Raabe

Hast recht, die 91 bzw. 33 gehörten da nicht rein, habe ich mal rausgenommen.

Ich hatte eigentlich ein Sortierdingens für eine Stringlist im Auge die diese List eben schlicht in der richtigen Reihenfolge wie z.B. der Explorer anzeigt.

creehawk

Gausi 21. Nov 2022 15:17

AW: Numerische höchster Stringwert
 
Dafür musst du eine passende Compare-Funktion nehmen. Wie das genau mit StringList und CustomSort dort geht, weiß ich auf Anhieb nicht. In meinem Player nutze ich für meine String-Properties der Objekte in den ObjectLists sowas:

Delphi-Quellcode:
function AnsiCompareText_Numbers(const S1, S2: string): Integer;
begin
  Result := CompareString(LOCALE_USER_DEFAULT, SORT_STRINGSORT or SORT_DIGITSASNUMBERS, PChar(S1),
    Length(S1), PChar(S2), Length(S2)) - CSTR_EQUAL;
end;
Relevant ist hier das Flag SORT_DIGITSASNUMBERS. Die Syntax der Compare-Funktion muss für StringListen ggf. etwas angepasst werden.

KodeZwerg 21. Nov 2022 23:01

AW: Numerische höchster Stringwert
 
Zitat:

Zitat von creehawk (Beitrag 1515129)
@Uwe Raabe

Hast recht, die 91 bzw. 33 gehörten da nicht rein, habe ich mal rausgenommen.

Ich hatte eigentlich ein Sortierdingens für eine Stringlist im Auge die diese List eben schlicht in der richtigen Reihenfolge wie z.B. der Explorer anzeigt.

creehawk

Der Explorer zeigt es doch genau so an wie Du es geschrieben hast.
Wenn Deine Dateien für eine Sortierung korrekt benannt wären, würden die auch so dargestellt werden wie Du es eigentlich möchtest.
(sgm001, sgm002 etc...)
Soll heißen, durchforste Deine Liste nach dem längsten string und füge dann nullen hinter sgm ein um mit der längsten länge gleich zu sein.

himitsu 21. Nov 2022 23:36

AW: Numerische höchster Stringwert
 
Wozu?

SORT_DIGITSASNUMBERS macht das, was gewollt ist.


Im Gunde zerlegt es den String in seine Einzelteile "Zahlen" und "Anderes" und sortiert die Teile entsprechens, also Zahlen wie Zahlen und nicht als String, wobei führende Nullen egal sind (außer die Zahlenwerte sind gleich, dann nochmal als String)

creehawk 22. Nov 2022 07:10

AW: Numerische höchster Stringwert
 
Moin Moin.

Ich habe jetzt wie vorgeschlagen die Zahlen aus den Dateinamen separiert und mit

FileNumbersList.CustomSort(SortStringListOfInteger );

sortiert.

Delphi-Quellcode:
function SortStringListOfInteger(List: TStringList; Index1, Index2: Integer): Integer;
var
  Value1, Value2: Integer;
begin
  Value1 := StrToInt(List[Index1]);
  Value2 := StrToInt(List[Index2]);
  if Value1 < Value2 then
    Result := -1
  else if Value2 < Value1 then
    Result := 1
  else
    Result := 0;
end;
Der Code ist mehrfach im Netz zu finden.

Was ich eben brauchte war Eure Hilfe um zu verstehen was ich machen muss bzw wonach man suchen kann.

Vielen Dank!!

creehawk

Gausi 22. Nov 2022 08:00

AW: Numerische höchster Stringwert
 
Verstehe ich das richtig? Du separierst aus der Original-Stringlist die Zahlen, packst diese in eine neue Stringlist, und sortierst diese, indem du die Strings darin zu Integer umwandelst? Kann man machen ... ist aber irgendwie von hinten durch die Brust ins Auge. :stupid:

So sollte es "direkt" gehen:
Delphi-Quellcode:
function SortStringListOfInteger(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := CompareString(LOCALE_USER_DEFAULT, SORT_STRINGSORT or SORT_DIGITSASNUMBERS, PChar(List[Index1]),
    Length(List[Index1]), PChar(List[Index2), Length(List[Index2)) - CSTR_EQUAL;
end;

himitsu 22. Nov 2022 09:26

AW: Numerische höchster Stringwert
 
Jupp, sollte es, da Windows ja das "Gleiche" schon fertig erledigt.

PS:
Delphi-Quellcode:
function SortStringListOfInteger(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := CompareValue(StrToInt(List[Index1]), StrToIntDef(List[Index2])); // StrToIntDef( ,0) oder ,MaxInt) oder ,MinInt) falls mal Fehler und keine Zahl drin
end;

Stevie 22. Nov 2022 15:07

AW: Numerische höchster Stringwert
 
Das ganze nennt sich übrigens natural sort order

Kann man auch StrCmpLogicalW für nutzen (zu finden in Winapi.ShLwApi.pas) - die ruft intern übrigens CompareString mit
Delphi-Quellcode:
NORM_IGNORECASE or SORT_DIGITSASNUMBERS
auf.

creehawk 22. Nov 2022 15:42

AW: Numerische höchster Stringwert
 
@gausi
Okay, von hinten durch die Brust ins Auge, kann man so sagen. Aber den Code verstehe ich ohne Probleme. Deine Lösung müsste ich erstmal ausgiebig ventilieren. Bin ich jetzt gerade zu faul für.... :duck:

@himitsu
.... und da ist die einfache Lösung. DAS war es was ich gesucht habe. Sehr schön. Vielen Dank. :-D

creehawk


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:16 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