![]() |
Strings zusammenführen und Bereinigen
Moin Moin.
Ich hatte folgende Sache schon mal hier irgendwo gelesen: Ich habe 3-10 Strings die so aussehen:
Delphi-Quellcode:
Die möchte ich zusammenführen so dass folgendes herauskommt:
String1 := '1,2,4,6,9';
String2 := '1,3,6,9,10,11'; String3 := '2,3,4,9,10'; etc.
Delphi-Quellcode:
Das Beispiel seinerzeit ging mit Automarken. Aber ich weiß nicht mehr wie das hieß oder wie ich jetzt die Frage formulieren soll....
String := '1,2,3,4,6,9,10,11';
creehawk |
AW: Strings zusammenführen und Bereinigen
Du möchtest
Mit welchem Schritt hast du genau Probleme? |
AW: Strings zusammenführen und Bereinigen
Tja, ich kann mir schon was zusammenschrauben. Das hat aber was Commodore 64 Basic.....
Wie lese ich aus einem String mit dem obigen Aufbau elegant jede einzelne Zahl? Habe ich die in ein arrray geschrieben wie entferne ich die doppelten Werte? creehawk |
AW: Strings zusammenführen und Bereinigen
mit 'nem Comma alle Strings zusammen (Join bzw +)
![]() ![]() ![]() such dir was aus oder erst hier alles Arrays zusammen (AddStringa oder +) ![]() FOR mit IF und Delete (oder vorher via ![]() Und dann ![]() |
AW: Strings zusammenführen und Bereinigen
Zitat:
|
AW: Strings zusammenführen und Bereinigen
Jupp!
Besten Dank! creehawk |
AW: Strings zusammenführen und Bereinigen
Oder eine TList<integer> nehmen und vor dem Einfügen prüfen, ob IndexOf(AktuelleZahl) < 0 ist.
|
AW: Strings zusammenführen und Bereinigen
Delphi-Quellcode:
Die Ausgabe sieht dann wie folgt aus:
Uses
Generics.Collections, System.SysUtils; Type TIntegerList = TList<Integer>; Type TIntegerListHelper = Class Helper for TIntegerList public Function ToString : String; end; Function TIntegerListHelper.ToString : String; Var i : Integer; begin Result := '['; for i := 0 to Count-1 do begin Result := Result + Items[i].ToString; if (i<Count-1) then Result := Result + ', '; end; Result := Result + ']'; end; Procedure AddToIntegerList(Var IntegerList:TIntegerList; aString:String); Var StringArray : TArray<string>; i : integer; Value : Integer; begin StringArray := aString.Split([',']); for I := 0 to High(StringArray) do begin Value := StrToInt(StringArray[i]); if (IntegerList.IndexOf(Value)=-1) then IntegerList.Add(Value); end; end; Procedure CreateIntegerList; Var IntegerList : TIntegerList; begin IntegerList := TIntegerList.Create; AddToIntegerList(IntegerList,'1,2,4,6,9'); AddToIntegerList(IntegerList,'1,3,6,9,10,11'); AddToIntegerList(IntegerList,'2,3,4,9,10'); IntegerList.Sort; Writeln(IntegerList.ToString); IntegerList.Free; end;
Code:
Eventuell noch eine try .. except um StrToInt, wenn Du dir nicht sicher bist, dass nur Zahlen im String sind.
[1, 2, 3, 4, 6, 9, 10, 11]
|
AW: Strings zusammenführen und Bereinigen
Ich hätte auch noch eine Alternative basierend auf einer gepimpten TStringList, die im Wesentlichen auf dem bisher gesagten aufbaut:
Delphi-Quellcode:
Zur Erklärung:
type
TNumberStringList = class(TStringList) protected function CompareStrings(const S1: string; const S2: string): Integer; override; public constructor Create; procedure AddNumbers(const ACommaText: string); end; constructor TNumberStringList.Create; begin inherited Create(dupIgnore, True, True); end; procedure TNumberStringList.AddNumbers(const ACommaText: string); begin AddStrings(ACommaText.Split([','])); end; function TNumberStringList.CompareStrings(const S1, S2: string): Integer; begin Result := string.Compare(S1, S2, [TCompareOption.coDigitAsNumbers]); end; procedure TestNumberStringList; var String1: string; String2: string; String3: string; begin String1 := '1,2,4,6,9'; String2 := '1,3,6,9,10,11'; String3 := '2,3,4,9,10'; var lst := TNumberStringList.Create; try lst.AddNumbers(String1); lst.AddNumbers(String2); lst.AddNumbers(String3); var S := lst.CommaText; Assert(S = '1,2,3,4,6,9,10,11'); finally lst.Free; end; end;
Der obige Ansatz funktioniert auch wenn nicht nur Zahlen vorkommen. In dem Fall wäre der CaseSensitive Parameter im Create aber vielleicht doch relevant. |
AW: Strings zusammenführen und Bereinigen
Uwe super elegante Lösung! Meine Lösung hätte ähnlich ausgesehen, nur nicht so geschickt mit den Sortieren.
Super mit dem unittest. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 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