![]() |
Delphi-Version: 5
Sortieren eines Arrays of String
Hallo,
ich bin hier relativ neu, und hab eine Aufgabe bekommen bei der ich momentan auf dem Schlauch stehe. Folgendes Szenario muss ich lösen. Ich habe eine "Textdokument" mit mehreren (98) Zeilen. Jede Zeile beinhaltet einen Code der früher oder später in ein Flashspeicher geschrieben wird. Eine Zeile sieht beispielsweise so aus: S10011223344556677889900AABBCCDDEEFF (natürlich nicht in dieser "perfekten" Reihenfolge)
Code:
Eine Zeile setzt sich wie folgt zusammen:
S1 / 00 / 1122 / ..... / FF | | | |Daten | | |Adresse | |Anzahl der Bytes |Startcode In diesem Fall wäre die Hexzahl "1122" die Adresse im Flashsspeicher, in die Daten geschrieben werden. Heißt die Daten "..." müssen an die Adresse "1122" geschrieben werden. Jede Zeile hat eine andere Adresse mit unterschiedlichen Daten. Um den Schreibvorgang im Flashspeicher zu beschleunigen muss ich bei der Adresse "0000" anfangen zu schreiben und bei der Adresse "FFFF" aufhören. Die Zeile sind aber durcheinander was heißt ich muss erstmal die alle Zeile sortieren im Bezug auf die Adresse z.b. Vor dem Sortieren Adresse Zeile 1: S1/00/ 3853 /..... Adresse Zeile 2: S1/00/ F325 /..... Adresse Zeiel 3: S1/00/ 1023 /..... Nach dem sortieren: Adresse Zeile 3: S1/00/ 1023 /..... Adresse Zeile 1: S1/00/ 3853 /..... Adresse Zeile 2: S1/00/ F325 /..... Natürlich darf ich nicht nur die Adresse berücksichtigen sondern muss die ganze Zeile "mit sortieren" Ich hab mir schon die Sortier-Algorithmen angeschaut bin aber auf keinen grünen zweig gekommen. PS. Jede Zeile steht in einem: Array of String |
AW: Sortieren eines Arrays of String
Ich würde mir eine entsprechende Klasse definieren, die Strings parsen und jede Instanz in eine TObjectList packen. Die kann man sortieren und anschließend von oben nach unten abarbeiten. Um Zahlen in hexadezimaler Darstellung zu sortieren musst Du sie erst in Zahlen umwandeln, das geht mit StrToInt('$' + hexadezimale Darstellung).
|
AW: Sortieren eines Arrays of String
Parsen und in ein Record packen. Dann kann man nach dem gewünschten Feld sortieren.
|
AW: Sortieren eines Arrays of String
Hallo,
das kannst Du doch mit einem normalem CustomSort hinbekommen. |
AW: Sortieren eines Arrays of String
Liste parsen und die Adresse im Objects[] - Feld ablegen und danach nach diesem Feld sortieren.
|
AW: Sortieren eines Arrays of String
Das geht mit 'ner TStringList.
Schau Dir bitte mal dashier an: ![]() Du müsstest das dortige Beispiel für die Funktion MyCompare entsprechend Deinen Anforderungen anpassen. |
AW: Sortieren eines Arrays of String
Liste der Anhänge anzeigen (Anzahl: 1)
Erstmal danke für die schnelle Antwort.
Am besten ich schreib noch dazu was ich bisher gemacht habe. - Textdatei in ein Memofeld laden - Eine Textzeile in ein Editfeld kopieren - Einzelne "Blöcke" in Editfelder kopieren. siehe Bild |
AW: Sortieren eines Arrays of String
Ich finde das alles etwas zu kompliziert.
Delphi-Quellcode:
aus
TArray.Sort(..)
Delphi-Quellcode:
bietet dir alles um ein Array zu sortieren wie du magst. Die Adresse und andere Dinge lassen sich prächtig mit regulären Ausdrucken (
System.Generics.Collections
Delphi-Quellcode:
) auslesen.
System.RegularExpressions
Hier ein Beispiel dass deine Strings der Adresse nach sortiert ausgibt:
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.Generics.Collections, System.Generics.Defaults, System.RegularExpressions; type TAddress = Word; function getAddress(const line: String): TAddress; const pattern = '^S(\d)(\d){2}((\d){4}).*FF'; var match: TMatch; begin match := TRegEx.Match(line, pattern); Result := TAddress.Parse(match.Groups[3].Value); end; procedure printLines(const lines: TArray<String>); inline; var line: String; begin for line in lines do WriteLn(line); end; procedure p(); var lines: TArray<String>; sortByAddress: IComparer<String>; begin lines := [ 'S10011223344556677889900AABBCCDDEEFF', // Adresse "1122" 'S10010223344556677889900AABBCCDDEEFF', // Adresse "1022" 'S10014223344556677889900AABBCCDDEEFF' // Adresse "1422" ]; sortByAddress := TComparer<String>.Construct( function(const left, right: String): Integer begin Result := getAddress(left) - getAddress(right); end ); TArray.Sort<String>(lines, sortByAddress); printLines(lines); end; begin p(); readln; end. |
AW: Sortieren eines Arrays of String
Kurz und knapp:
Delphi-Quellcode:
procedure TForm1.SortMemo;
var i : Integer; k : Integer; s : String; begin for i := 0 to Memo1.Lines.Count - 1 do begin for k := i + 1 to Memo1.Lines.Count - 1 do begin if Copy(Memo1.Lines[k],5,4) < Copy(Memo1.Lines[i],5,4) then begin s := Memo1.Lines[i]; Memo1.Lines[i] := Memo1.Lines[k]; Memo1.Lines[k] := s; end; end; end; end; |
AW: Sortieren eines Arrays of String
Hallo,
Memo1.BeginUpdate/EndUpdate nicht vergessen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 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 by Thomas Breitkreuz