Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte » 

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Sortieren eines Arrays of String (https://www.delphipraxis.net/201283-sortieren-eines-arrays-string.html)

DonPedroFo 8. Jul 2019 10:18

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

DeddyH 8. Jul 2019 10:27

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).

Luckie 8. Jul 2019 10:40

AW: Sortieren eines Arrays of String
 
Parsen und in ein Record packen. Dann kann man nach dem gewünschten Feld sortieren.

hoika 8. Jul 2019 10:42

AW: Sortieren eines Arrays of String
 
Hallo,
das kannst Du doch mit einem normalem CustomSort hinbekommen.

Whookie 8. Jul 2019 10:47

AW: Sortieren eines Arrays of String
 
Liste parsen und die Adresse im Objects[] - Feld ablegen und danach nach diesem Feld sortieren.

Delphi.Narium 8. Jul 2019 10:47

AW: Sortieren eines Arrays of String
 
Das geht mit 'ner TStringList.

Schau Dir bitte mal dashier an: https://www.delphipraxis.net/835874-post7.html

Du müsstest das dortige Beispiel für die Funktion MyCompare entsprechend Deinen Anforderungen anpassen.

DonPedroFo 8. Jul 2019 10:53

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

Der schöne Günther 8. Jul 2019 11:11

AW: Sortieren eines Arrays of String
 
Ich finde das alles etwas zu kompliziert.
Delphi-Quellcode:
TArray.Sort(..)
aus
Delphi-Quellcode:
System.Generics.Collections
bietet dir alles um ein Array zu sortieren wie du magst. Die Adresse und andere Dinge lassen sich prächtig mit regulären Ausdrucken (
Delphi-Quellcode:
System.RegularExpressions
) auslesen.

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.

Delphi.Narium 8. Jul 2019 11:15

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;

hoika 8. Jul 2019 12:01

AW: Sortieren eines Arrays of String
 
Hallo,
Memo1.BeginUpdate/EndUpdate nicht vergessen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 Uhr.
Seite 1 von 4  1 23     Letzte » 

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz