Zwei Listen vergleichen

doktordoom

Mitglied
Guten Abend,
aktuell versuche Ich zwei Listen siehe unten zu vergleichen. Die zweite Liste besteht aus Objecten von einer Klasse.
Die Klasse steht für die Mitarbeiter, diese haben logisch bestimmte Eigenschfaten. Wie z.B Mitarbeitername.
Diesen Mitarbeitername gibt es in der List2 von Objekten, aber auch in der List1.

Aktuell habe ich noch kein Ansatz gefunden der funktional ist.

Java:
List<List<String>> List1 = new ArrayList<List<String>>();

List<class> List2 = new ArrayList<>();

Class.List2.stream().anyMatch(List1::contains);
 
Wichtige Frage: Wann genau gelten 2 Listen als gleich?
Wenn sie die gleichen Elemente haben? Wenn alle Namen in Liste 2 in einem Objekt von Liste1 auftauchen?
Was, falls der Name eines Mitarbeiters aus Liste1 in Liste2 doppelt vorkommt?
Was, falls der Name eines Mitarbeiters aus Liste1 in Liste 2 gar nicht vorkommt?

ich gehen jetzt grad mal davon aus, dass jeder Name in Liste 1 eindeutig ist.
Wenn es eine 1:1 Übereinstimmung braucht, dann fang als erstes damit an, doppelte Einträge aus Liste2 rauszufiltern.
Dann vergleich die Listenlänge, die muss gleich sein. Ist sie das nicht, dann erübrigt sich alles weitere.
Da man nun sowohl in Liste1 als auch Liste2 eindeutige Namen hat, kann man mit einem Stream und allMatch prüfen, ob es für jeden Eintrag aus Liste2 einen passenden Eintrag in Liste1 gibt, so etwa
namesList.stream().allMatch(name -> list1.stream().anyMatch(p.getName().equals(name)));
oder andersrum
list1.stream().map(Person::getName).allMatch(list2::contains);


ps: Deine Datenmodelle sind hier nicht wirklich sinnvoll. Fang mal damit an, die Klasse zu definieren, die einen Mitarbeiter beschreibt.
"Objecten von einer Klasse" ... alle Objekte haben eine Klasse, Eine Liste von Klassen ergibt keinen Sinn - es sei denn, dich interessiert der Name der Klasse. Und auch dann kann man sich mit String behelfen.
 
Zuletzt bearbeitet:
Guten Abend,
unten seht ihr ein oder das Beispiel. Aktuell gibt es eine Liste von Objekten.
Dabei hat der Index 2 oder das Objekt den Mitarbeitername.
Des Weiteren gibt es eine Matrix die durch eine MitarbeiterDB befüllt wird. Hier steht in der Zeile 1 oder Index 1 der Mitarbeitername.
Jetzt würde ich gerne beide vergleichen wollen ob in beiden der Name Schulze auftritt.

Java:
package example.jdbc.movies;


import java.util.ArrayList;
import java.util.List;

/**
 * This class is used get links from HTML using Jsoup.
 * @author w3spoint
 */
public class Mitarbeiter {

    private static String mitarbeitername ="";

    private static String mitarbeiterguid = "";

    private static int mitarbeiteralter = 0;

    static List<Mitarbeiter> MitarbeiterList = new ArrayList<>();

    public Mitarbeiter(String Name,String GUID,int Alter)
    {
        this.mitarbeitername = Name;
        this.mitarbeiterguid = GUID;
        this.mitarbeiteralter =Alter;
    }

    public String getMitarbeitername()
    {
        return this.mitarbeitername;
    }

    public String getGUID()
    {
        return this.mitarbeiterguid;
    }

    public int getAlter()
    {
        return this.mitarbeiteralter;
    }

    public void setMitarbeitername(String Name)
    {
        this.mitarbeitername = Name;
    }

    public void setGUID(String guid)
    {
        this.mitarbeiterguid = guid;
    }

    public void setAlter(int Alter)
    {
        this.mitarbeiteralter = Alter;
    }

    public static void main(String args[]){

        List<List<String>> Mitarbeiterdb = new ArrayList<List<String>>();

        Mitarbeiterdb.add(new ArrayList<String>());
        Mitarbeiterdb.get(0).add( "Fischer");
        Mitarbeiterdb.get(0).add( "0815");
        Mitarbeiterdb.get(0).add( "0.782311");
        Mitarbeiterdb.add(new ArrayList<String>());
        Mitarbeiterdb.get(1).add( "Schulze");
        Mitarbeiterdb.get(1).add( "0817");
        Mitarbeiterdb.get(1).add( "0.124665");
        Mitarbeiterdb.add(new ArrayList<String>());
        Mitarbeiterdb.get(2).add( "Wagner");
        Mitarbeiterdb.get(2).add( "2133");
        Mitarbeiterdb.get(2).add("0.45614");

        MitarbeiterList.add(new Mitarbeiter("Müller","X123sa",25));
        MitarbeiterList.add(new Mitarbeiter("Meier","STRvdss",87));
        MitarbeiterList.add(new Mitarbeiter("Schulze","12cSA1",12));


        System.out.println(MitarbeiterList.get(0).getMitarbeitername());

        System.out.println(Mitarbeiterdb.get(1).get(0));


    }
}
 
Bitte schau Dir ganz dringend an, was static macht. Und dann überlege genau, wo es Sinn macht und wo es absolut keinen Sinn macht!
Und ganz wichtig: spiel etwas damit herum! Wenn Du so eine Klasse Mitarbeiter hast, dann erstelle mal zwei Instanzen und dann gib diese aus.

Des Weiteren gibt es eine Matrix die durch eine MitarbeiterDB befüllt wird. Hier steht in der Zeile 1 oder Index 1 der Mitarbeitername.
Jetzt würde ich gerne beide vergleichen wollen ob in beiden der Name Schulze auftritt.
Dazu kannst Du Dir doch einfache Suchmethoden schreiben. Also eine Methode, die ein boolean zurück gibt und die Datenquelel sowie den zu suchenden Namen enthält. Und dann kannst Du Dir überlegen, wie Du durch die beiden Datenquellen durchgehen kannst, um das zu prüfen.

Das Vorgehen ist immer gleich:
1. Überlege Dir genau, wie Du es machen würdest. Nimm Dir Stift und Papier, male die Beispieldaten auf und dann überlege, wie Du da durchgehen kannst. Alternativ kannst Du Dir auch alles bildlich vorstellen. Die MitarbeiterList wäre dann sowas wie ein Karteikasten und jeder Mitarbeiter wäre eine Karteikarte. Wie findest Du heraus, ob es da einen Mitarbeiter mit Name Schulze gibt?

2. Wenn Du das im Detail überlegt hast, dann formuliere es in Worte. Also auch hier noch kein Java oder programmieren.

3. Die Worte kannst Du dann umsetzen in Code.

Dieses Vorgehen ist das, was in der Regel gut zum Ziel führt. Daher kann ich Dir so eine Methodik nur sehr ans Herz legen!
 
... und warum haben Mitarbeiter überhaupt eine (gemeinsame, da static) Mitarbeiterliste? Sag jetzt nicht, das hat mit der main-Methode zu tun, denn die gehört auch nicht in eine Datenklasse.
Die Klasse Mitarbeiter sollte nur die Daten des Mitarbeiters beinhalten und sonst gar nichts.
 
Hi,
ich habe es so gemacht wie @KonradN es gesagt hat und es funktioniert. Ich hätte nur gerne verstanden wie solche Konstrukte "list1.stream().map(Person::getName).allMatch(list2::contains);" 100% funktionieren. Vielleicht kennt jemand eine gute Seite.
@Neumi5694 danke für den Hinweis. Es sollte nur ein Bsp. sein zum verstehen.
 

Zurück
Oben