AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Strings zusammenführen und Bereinigen
Thema durchsuchen
Ansicht
Themen-Optionen

Strings zusammenführen und Bereinigen

Ein Thema von creehawk · begonnen am 8. Mai 2023 · letzter Beitrag vom 12. Mai 2023
Antwort Antwort
Seite 1 von 2  1 2      
creehawk

Registriert seit: 1. Jul 2013
Ort: Hamburg
233 Beiträge
 
Delphi 10.4 Sydney
 
#1

Strings zusammenführen und Bereinigen

  Alt 8. Mai 2023, 09:04
Moin Moin.

Ich hatte folgende Sache schon mal hier irgendwo gelesen:

Ich habe 3-10 Strings die so aussehen:

Delphi-Quellcode:
String1 := '1,2,4,6,9';
String2 := '1,3,6,9,10,11';
String3 := '2,3,4,9,10';
etc.
Die möchte ich zusammenführen so dass folgendes herauskommt:

String := '1,2,3,4,6,9,10,11'; Das Beispiel seinerzeit ging mit Automarken. Aber ich weiß nicht mehr wie das hieß oder wie ich jetzt die Frage formulieren soll....

creehawk
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Strings zusammenführen und Bereinigen

  Alt 8. Mai 2023, 09:08
Du möchtest
  1. Die Zahlen aus jedem String (3-10) erkennen und z.B. in ein Array schreiben
  2. Die Zahlen im Array aufsteigend sortieren
  3. Doppelte Vorkommen entfernen
  4. Aus dem Zahlen-Array wieder einen String machen

Mit welchem Schritt hast du genau Probleme?
  Mit Zitat antworten Zitat
creehawk

Registriert seit: 1. Jul 2013
Ort: Hamburg
233 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Strings zusammenführen und Bereinigen

  Alt 8. Mai 2023, 09:33
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.157 Beiträge
 
Delphi 12 Athens
 
#4

AW: Strings zusammenführen und Bereinigen

  Alt 8. Mai 2023, 09:50
mit 'nem Comma alle Strings zusammen (Join bzw +)
Delphi-Referenz durchsuchenSplitString
Delphi-Referenz durchsuchenstring.Split
Delphi-Referenz durchsuchenStringList.CommaText
such dir was aus

oder erst hier alles Arrays zusammen (AddStringa oder +)

Delphi-Referenz durchsuchenTArray.Sort

FOR mit IF und Delete (oder vorher via Delphi-Referenz durchsuchenstringlist.Duplicates)

Und dann Delphi-Referenz durchsuchenstring.Join
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 8. Mai 2023 um 09:54 Uhr)
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
711 Beiträge
 
Delphi XE5 Professional
 
#5

AW: Strings zusammenführen und Bereinigen

  Alt 8. Mai 2023, 09:53
... Habe ich die in ein arrray geschrieben wie entferne ich die doppelten Werte?
Nach dem Sortieren vergleichst Du, ob benachbarte Werde gleich sind.
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
creehawk

Registriert seit: 1. Jul 2013
Ort: Hamburg
233 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Strings zusammenführen und Bereinigen

  Alt 8. Mai 2023, 09:54
Jupp!

Besten Dank!

creehawk
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Strings zusammenführen und Bereinigen

  Alt 8. Mai 2023, 09:54
Oder eine TList<integer> nehmen und vor dem Einfügen prüfen, ob IndexOf(AktuelleZahl) < 0 ist.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von arcticwolf
arcticwolf

Registriert seit: 3. Aug 2021
Ort: Erfurt
41 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Strings zusammenführen und Bereinigen

  Alt 8. Mai 2023, 10:27
Delphi-Quellcode:
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;
Die Ausgabe sieht dann wie folgt aus:

Code:
[1, 2, 3, 4, 6, 9, 10, 11]
Eventuell noch eine try .. except um StrToInt, wenn Du dir nicht sicher bist, dass nur Zahlen im String sind.
Wolfgang
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.021 Beiträge
 
Delphi 12 Athens
 
#9

AW: Strings zusammenführen und Bereinigen

  Alt 8. Mai 2023, 11:13
Ich hätte auch noch eine Alternative basierend auf einer gepimpten TStringList, die im Wesentlichen auf dem bisher gesagten aufbaut:
Delphi-Quellcode:
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;
Zur Erklärung:
  • Mit dem dupIgnore, True im Create werden erst gar eine Doubletten hinzugefügt (das zweite True für CaseSensitive ist hier redundant)
  • Das coDigitAsNumbers im CompareStrings sorgt für eine korrekte Sortierung der Zahlen
  • Das AddNumbers vereinfacht das Hinzufügen der einzelnen Listen

Der obige Ansatz funktioniert auch wenn nicht nur Zahlen vorkommen. In dem Fall wäre der CaseSensitive Parameter im Create aber vielleicht doch relevant.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#10

AW: Strings zusammenführen und Bereinigen

  Alt 10. Mai 2023, 12:56
Uwe super elegante Lösung! Meine Lösung hätte ähnlich ausgesehen, nur nicht so geschickt mit den Sortieren.
Super mit dem unittest.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:35 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