Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi sortierte Listen manipulieren (https://www.delphipraxis.net/195692-sortierte-listen-manipulieren.html)

zeras 18. Mär 2018 20:57

sortierte Listen manipulieren
 
Ich habe folgende Funktion, um Strings in Stringlisten zu kürzen.
Dabei kommt folgende Fehlermeldung: "Operation für sortierte Listen nicht zulässig".
Wie kann ich trotzdem die Listeneinträge manipulieren?

Delphi-Quellcode:
const
  SOIdLen = 8;

var
  i : Integer;
  s : String;
  len : Integer;


begin
  if SLSONumber.Count > 0 then begin
    for I := 0 to SLSONumber.Count -1 do begin
      s := SLSONumber[i];
       len := length(s);
       if len > SOIdLen then begin
         Delete(s, 9, len - SOIdLen);
         SLSONumber[i] := s;
       end;
    end;
  end;
end;
Die Listen sind wie folgt erzeugt:
Delphi-Quellcode:
  vSPSSO := TStringList.Create;
  vSPSSO.Duplicates := dupIgnore;
  vSPSSO.Sorted := True;

KodeZwerg 18. Mär 2018 21:03

AW: sortierte Listen manipulieren
 
Ich weiß nicht genau ob es richtig ist aber probier mal "for i := 1" anstelle der 0.

Zacherl 18. Mär 2018 21:31

AW: sortierte Listen manipulieren
 
Ne, die
Delphi-Quellcode:
0
ist schon richtig. Du musst vermutlich
Delphi-Quellcode:
Sorted
erst wieder auf
Delphi-Quellcode:
false
setzen, bevor du den Inhalt änderst.

Delphi.Narium 18. Mär 2018 21:33

AW: sortierte Listen manipulieren
 
Stringlisten beginnen bei 0, das ist so schon ok.

Durch die Zuweisung
Delphi-Quellcode:
SLSONumber[i] := s;
kann sich die Reihenfolge der Einträge in der Liste (zumindest theoretisch) verändern. Vermutlich mag die Liste das so nicht. Was passiert, wenn Du Deine Routine so abänderst?
Delphi-Quellcode:
const
  SOIdLen = 8;

var
  i : Integer;
  s : String;
  len : Integer;


begin
  SLSONumber.Sorted := False; // <-neu
  if SLSONumber.Count > 0 then begin
    for I := 0 to SLSONumber.Count -1 do begin
      s := SLSONumber[i];
       len := length(s);
       if len > SOIdLen then begin
         Delete(s, 9, len - SOIdLen);
         SLSONumber[i] := s;
       end;
    end;
  end;
  SLSONumber.Sorted := True; // <-neu
end;

zeras 18. Mär 2018 21:39

AW: sortierte Listen manipulieren
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1396557)
Stringlisten beginnen bei 0, das ist so schon ok.

Durch die Zuweisung
Delphi-Quellcode:
SLSONumber[i] := s;
kann sich die Reihenfolge der Einträge in der Liste (zumindest theoretisch) verändern. Vermutlichm mag die Liste das so nicht. Was passiert, wenn Du Deine Routine so abänderst?
Delphi-Quellcode:
const
  SOIdLen = 8;

var
  i : Integer;
  s : String;
  len : Integer;


begin
  SLSONumber.Sorted := False; // <-neu
  if SLSONumber.Count > 0 then begin
    for I := 0 to SLSONumber.Count -1 do begin
      s := SLSONumber[i];
       len := length(s);
       if len > SOIdLen then begin
         Delete(s, 9, len - SOIdLen);
         SLSONumber[i] := s;
       end;
    end;
  end;
  SLSONumber.Sorted := True; // <-neu
end;

Danke, werde das morgen ausprobieren.

Wie es aussieht, geht die Änderung. Eigentlich einfach, wenn mans weiß.

DeddyH 18. Mär 2018 22:01

AW: sortierte Listen manipulieren
 
Das müsste doch auch kürzer gehen.
Delphi-Quellcode:
Liste.Sorted := false;
for I := 0 to Liste.Count - 1 do
  liste[i] := Copy(Liste[i], 1, 8);
Liste.Sorted := true;
Ungetestet, da auf dem Tablet getippt.

himitsu 18. Mär 2018 23:42

AW: sortierte Listen manipulieren
 
Ja, ist kürzer, aber es hat nicht die selbe Funktion, denn der originale Code macht nichts, wenn wenn nicht mindestens ein Zeichen übrig bleibt.

So geht es auch.
Delphi-Quellcode:
for i := 0 to Liste.Count - 1 do begin
  Liste.Add(LeftStr(Liste[i], 8));
  Liste.Delete(i + 1);
end;
Unter der Annahme/Bedingung:
* die Liste ist sortiert
* der gekürzte String ist in der Sortierung immer kleiner, also landet immer vor dem Originalstring
* durch dupIgnore würde der Code knallen, wenn einer/mehrere der Strings nicht länger als 8 ist (denn dann kommt immer ein Leerstring '' raus und die Indize stimmen dann nicht mehr)

Aber wie gesagt, es fehlt noch eine Bedingung.
Delphi-Quellcode:
for i := 0 to Liste.Count - 1 do
  if Length(Liste[i]) > 8 then begin
    ...

Uwe Raabe 19. Mär 2018 07:34

AW: sortierte Listen manipulieren
 
Zitat:

Zitat von himitsu (Beitrag 1396560)
Aber wie gesagt, es fehlt noch eine Bedingung.

Nein, fehlt nicht.
Delphi-Quellcode:
liste[i] := Copy(Liste[i], 1, 8);
übernimmt die ersten bis zu 8 Zeichen.

Zitat:

Gibt Count mehr Zeichen oder Array-Elemente an, als verfügbar sind, werden nur die Zeichen oder Elemente von S[Index] bis zum Ende von S zurückgegeben.
Die Abfrage ist also redundant.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 Uhr.

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