AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Zwei Listen filtern Denkproblem

Ein Thema von DieDolly · begonnen am 28. Mai 2019 · letzter Beitrag vom 28. Mai 2019
Antwort Antwort
Seite 1 von 2  1 2   
DieDolly

Registriert seit: 22. Jun 2018
948 Beiträge
 
#1

Zwei Listen filtern Denkproblem

  Alt 28. Mai 2019, 11:14
Ich komme gerade nicht weiter weil ich einen Knoten im Kopf habe.
ich habe zwei Listen. Eine enthält Städtenamen und die andere enthält jede statt mit jeder Stadt mit Komma getrennt.

Zitat:
berlin
düsseldorf
köln
nürnberg
usw
und die andere Liste
Zitat:
berlin,düsseldorf
berlin,köln
berlin,nürnberg
(und alle auch noch einmal andersherum, also düsseldorf,berlin usw).
In der zweiten Liste können Städte sein (vor und nach dem Komma), die nicht in der ersten sind. Wie bekomme ich die da jetzt heraus? Ich habe gerade Probleme damit das in Schleifen zu packen und abzufragen ohne was falsches zu löschen.
  Mit Zitat antworten Zitat
Schokohase

Registriert seit: 17. Apr 2018
828 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Zwei Listen filtern Denkproblem

  Alt 28. Mai 2019, 11:18
Du musst deine Problem in Teilprobleme zerlegen.

1. Aus einem String mit komma-getrennten Werten ein string-Array erstellen
2. Entfernen von Einträgen aus einem Array, wenn diese nicht in einem anderen Array enthalten sind
3. Aus einem String-Array wieder einen String mit den komma-getrennten Einträgen erstellen

Wo hast du Probleme?
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
948 Beiträge
 
#3

AW: Zwei Listen filtern Denkproblem

  Alt 28. Mai 2019, 11:20
Zitat:
Aus einem String mit komma-getrennten Werten ein string-Array erstellen
Die sind schon in Klasseninstanzen und Records abgelegt. Ich kann auf alle Städte zugreifen.

Zitat:
Wo hast du Probleme?
Damit
Zitat:
2. Entfernen von Einträgen aus einem Array, wenn diese nicht in einem anderen Array enthalten sind

Arrays brauche ich nicht. Habe wie gesagt schon alles in Klassen und die erste Städteliste ist eine StringList.
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
1.868 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Zwei Listen filtern Denkproblem

  Alt 28. Mai 2019, 11:30
EDIT: Bitte ignorieren, habe einen Denkfehler drin.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber.

Geändert von Codehunter (28. Mai 2019 um 11:33 Uhr)
  Mit Zitat antworten Zitat
Schokohase

Registriert seit: 17. Apr 2018
828 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: Zwei Listen filtern Denkproblem

  Alt 28. Mai 2019, 11:32
Arrays brauche ich nicht. Habe wie gesagt schon alles in Klassen und die erste Städteliste ist eine StringList.
Wenn du etwas flexibler wärst und abstrakter an die Sache herangehen würdest, dann könnte ich dir eine Lösung präsentieren.

Hier mal eine abstrakte Darstellung deines Problems aus Punkt 2:

Entferne alle Einträge aus Menge A die nicht in der Menge B enthalten sind.

So einfach, so schlicht, ... so trivial
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
948 Beiträge
 
#6

AW: Zwei Listen filtern Denkproblem

  Alt 28. Mai 2019, 11:34
Ich möchte Städte aus Liste 2 löschen die nicht in Liste 1 sind.

Delphi-Quellcode:
Staedte1 := TStringList.Create;
 Staedte2 := TStringList.Create;
 try
  // Liste 1
  Staedte1.Add('berlin');
  Staedte1.Add('dusseldorf');
  Staedte1.Add('koln');
  Staedte1.Add('nurnberg');

  // Liste 2
  Staedte2.Add('berlin,berlin');
  Staedte2.Add('berlin,dusseldorf');
  Staedte2.Add('berlin,koln');
  Staedte2.Add('berlin,napoli');
  Staedte2.Add('berlin,nurnberg');

  Staedte2.Add('dusseldorf,berlin');
  Staedte2.Add('dusseldorf,dusseldorf');
  Staedte2.Add('dusseldorf,koln');
  Staedte2.Add('dusseldorf,napoli');
  Staedte2.Add('dusseldorf,nurnberg');

  Staedte2.Add('koln,berlin');
  Staedte2.Add('koln,dusseldorf');
  Staedte2.Add('koln,koln');
  Staedte2.Add('koln,napoli');
  Staedte2.Add('koln,nurnberg');

  Staedte2.Add('napoli,berlin');
  Staedte2.Add('napoli,dusseldorf');
  Staedte2.Add('napoli,koln');
  Staedte2.Add('napoli,napoli');
  Staedte2.Add('napoli,nurnberg');

  Staedte2.Add('nurnberg,berlin');
  Staedte2.Add('nurnberg,dusseldorf');
  Staedte2.Add('nurnberg,koln');
  Staedte2.Add('nurnberg,napoli');
  Staedte2.Add('nurnberg,nurnberg');



 finally
  Staedte1.Free;
  Staedte2.Free;
 end;
Bei diesem Beispiel sollen alle Einträge mit napoli aus Staedte2 entfernt werden.

Mein erster kläglicher Versuch
Delphi-Quellcode:
for i := 0 to Staedte1.Count - 1 do
   begin
    StadtListe1 := Staedte1.Strings[i];
    StadtGefunden := False;

    for j := Staedte2.Count - 1 downto 0 do
     begin
      Stadt1 := Staedte2.Strings[j].Split([','])[0];
      Stadt2 := Staedte2.Strings[j].Split([','])[1];

      StadtGefunden := (Stadt1 = StadtListe1) or (Stadt2 = StadtListe1);

      if StadtGefunden then
       Break;
     end;

    if not StadtGefunden then
     ShowMessage(StadtListe1);
   end;
Angezeigt bekomme ich nichts obwohl ich napoli sehen müsste.

Geändert von DieDolly (28. Mai 2019 um 11:48 Uhr)
  Mit Zitat antworten Zitat
Schokohase

Registriert seit: 17. Apr 2018
828 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

AW: Zwei Listen filtern Denkproblem

  Alt 28. Mai 2019, 11:50
Wie gesagt, abstrakt formuliert kommt man auf so etwas
Delphi-Quellcode:
program StadtVerwaltung;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  System.Generics.Defaults,
  System.Generics.Collections;

type
  TArray = class(System.Generics.Collections.TArray)
  public
    class function &Intersect<T>(const A, B: array of T): TArray<T>; overload;
    class function &Intersect<T>(const A, B: array of T; const AComparer: IEqualityComparer<T>): TArray<T>; overload;
  end;

  { TArray }

class function TArray.Intersect<T>(const A, B: array of T; const AComparer: IEqualityComparer<T>): TArray<T>;
var
  vA, vB: T;
begin
  Result := [];
  for vA in A do
  begin
    for vB in B do
    begin
      if AComparer.Equals(vA, vB) then
      begin
        Result := Result + [vA];
        Break;
      end;
    end;
  end;
end;

class function TArray.Intersect<T>(const A, B: array of T): TArray<T>;
begin
  Result := Intersect<T>(A, B, TEqualityComparer<T>.Default);
end;

procedure Main;
var
  A, B, vBArr: TArray<string>;
  idx: Integer;
begin
  A := ['a', 'b', 'c', 'd'];
  B := ['a,b', 'a,e,d'];
  for idx := Low(B) to High(B) do
  begin
    vBArr := B[idx].Split([',']);
    vBArr := TArray.Intersect<string>(vBArr, A);
    B[idx] := String.Join(',', vBArr);
  end;
end;

begin
  try
    { TODO -oUser -cConsole Main : Code hier einfügen }
    Main;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.
PS Ja, ich weiß, dass es sich hier nicht wirklich um die Schnittmenge handelt und somit die Methode anders benannt werden müsste

Geändert von Schokohase (28. Mai 2019 um 11:53 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
948 Beiträge
 
#8

AW: Zwei Listen filtern Denkproblem

  Alt 28. Mai 2019, 11:53
Danke für die Hilfe aber das hilft mir alle nicht weiter. Das ist wie mit Kanonen auf Spatzen schießen.

Hier sehe ich am Ende dusseldorf obwohl es in der Liste1 ist. Was ich sehen muss ist napoli damit alles was napoli beinhaltet raus kann.
Delphi-Quellcode:
Staedte1 := TStringList.Create;
 Staedte2 := TStringList.Create;
 try
  // Liste 1
  Staedte1.Add('berlin');
  Staedte1.Add('dusseldorf');

  // Liste 2
  Staedte2.Add('berlin,berlin');
  Staedte2.Add('berlin,dusseldorf');
  Staedte2.Add('berlin,napoli');

  Staedte2.Add('dusseldorf,berlin');
  Staedte2.Add('dusseldorf,dusseldorf');
  Staedte2.Add('dusseldorf,napoli');

  Staedte2.Add('napoli,berlin');
  Staedte2.Add('napoli,dusseldorf');
  Staedte2.Add('napoli,napoli');

  for j := Staedte2.Count - 1 downto 0 do
   begin
    Stadt1 := Staedte2.Strings[j].Split([','])[0];
    Stadt2 := Staedte2.Strings[j].Split([','])[1];
    LoescheStadt := False;

    for i := 0 to Staedte1.Count - 1 do
     begin
      StadtListe1 := Staedte1.Strings[i];

      LoescheStadt := (StadtListe1 <> Stadt1) and (StadtListe1 <> Stadt2);

      if LoescheStadt then
       Break;
     end;

    if LoescheStadt then
     Staedte2.Delete(j);
   end;

  ShowMessage(Staedte2.Text);
 finally
  Staedte1.Free;
  Staedte2.Free;
 end;

Geändert von DieDolly (28. Mai 2019 um 12:10 Uhr)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.291 Beiträge
 
Delphi XE7 Professional
 
#9

AW: Zwei Listen filtern Denkproblem

  Alt 28. Mai 2019, 12:13
.. vielleicht ungefähr so, über eine dritte Liste.

Delphi-Quellcode:
  for i:=0 to staedte1.count -1 do
    for j:= 0 to staedte1.count -1 do
      begin
         idx := stadte2.indexOf(staedte1[i]+','+staedte1[j]);
         if idx > -1 then
           begin
             staedteTemp.add(staedte2[idx]);
             staedte2.delete(idx);
           end;
      end;

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
948 Beiträge
 
#10

AW: Zwei Listen filtern Denkproblem

  Alt 28. Mai 2019, 12:16
Eine dritte Liste kann ich leider nicht anlegen. Alle notwendigen Informationen habe ich schon in einer unveränderbaren StringList und einer generischen TObjectList aus der herausgelöscht werden soll.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 05:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf