Einzelne Objekte und Unterobjekte einer ArrayList ausgeben

ac0h1m

Mitglied
Hallo, ich bin mittlerweile am verzweifeln..
Zu meiner Frage, ich habe eine csv-Datei, welche in eine ArrayList gelesen wird. Nun will ich die ArrayList nach zwei Objekten und die dazugehörigen Datentypen (pid und tid) haben in eine Neue ArrayList speichern. Ich bekomme es einfach nicht hin. Im Bild ist nochmal die Datei aufgezeigt. Ich würde es gerne ohne Stream lösen.
Vielen Danke👋🏻
 

Anhänge

  • Bildschirmfoto 2022-10-23 um 13.41.02.png
    Bildschirmfoto 2022-10-23 um 13.41.02.png
    316,6 KB · Aufrufe: 8
  • Bildschirmfoto 2022-10-23 um 13.37.54.png
    Bildschirmfoto 2022-10-23 um 13.37.54.png
    421,5 KB · Aufrufe: 6
Was genau ist das Problem? Du iterierst über die 1. Liste und fügst die passenden Elemente der zweiten Liste hinzu. Zeig doch mal in Codetags </> was du schon hast.
 
Was genau ist das Problem? Du iterierst über die 1. Liste und fügst die passenden Elemente der zweiten Liste hinzu. Zeig doch mal in Codetags </> was du schon hast.
Ich möchte aus der Arrayliste (Input) nur zwei Attribute in eine neue ArrayListe einlesen und diese zurückgeben. Hier ist nochmal die Aufgabenstellung.
 

Anhänge

  • Bildschirmfoto 2022-10-24 um 08.45.30.png
    Bildschirmfoto 2022-10-24 um 08.45.30.png
    149,8 KB · Aufrufe: 2
Ich möchte aus der Arrayliste (Input) nur zwei Attribute in eine neue ArrayListe einlesen und diese zurückgeben. Hier ist nochmal die Aufgabenstellung.
Noch einmal die Frage: Was genau ist DEIN Problem? Woran scheiterst Du? Die Aufgabenstellung ist uns klar, einen einfachen Lösungsweg hat @Oneixee5 beschrieben. Was fehlt Dir, um diese Lösungsidee umzusetzen?

Ansonsten sieht das nicht wie eine typische Java Aufgabe aus, in der man das erste mal über eine Liste iteriert. Wenn Ihr Streams kennt / kennen solltet, dann ist das ein typischer Stream Einzeiler (der auf 3 Zeilen umgebrochen wird damit er besser gelesen werden kann):
1. Zeile der Stream
2. Zeile der Filter
3. Zeile das Collect
 
Noch einmal die Frage: Was genau ist DEIN Problem? Woran scheiterst Du? Die Aufgabenstellung ist uns klar, einen einfachen Lösungsweg hat @Oneixee5 beschrieben. Was fehlt Dir, um diese Lösungsidee umzusetzen?

Ansonsten sieht das nicht wie eine typische Java Aufgabe aus, in der man das erste mal über eine Liste iteriert. Wenn Ihr Streams kennt / kennen solltet, dann ist das ein typischer Stream Einzeiler (der auf 3 Zeilen umgebrochen wird damit er besser gelesen werden kann):
1. Zeile der Stream
2. Zeile der Filter
3. Zeile das Collect
Danke für die schnelle Antwort. Also mein Problem ist die Syntax. Ich weiß das ich über die erste Liste iterieren muss und es in die zweite Liste einfügen soll. Habe es mit einer for-Schleife und einem if-Statement versucht, jedoch wird das nichts. Also es scheitert am Umsetzten von Theorie in Praxis..
 
Bisher habe ich so viel. Jedoch weiß ich nicht wie ich das Iterieren nutzen soll um pid und tid in die neue Liste einzufügen
 

Anhänge

  • Bildschirmfoto 2022-10-24 um 09.02.00.png
    Bildschirmfoto 2022-10-24 um 09.02.00.png
    202,2 KB · Aufrufe: 5
Das ist doch schon ein super Anfang - damit kopierst Du alle Element in die Zielliste.

Jetzt musst Du nur noch das Innere der for each Schleife anpassen, so dass das Einfügen in die Zielliste nur erfolgt, wenn die gewünschte Bedingung erfüllt ist. Wie kannst Du in Java eine Bedingung prüfen?
 
Das ist doch schon ein super Anfang - damit kopierst Du alle Element in die Zielliste.

Jetzt musst Du nur noch das Innere der for each Schleife anpassen, so dass das Einfügen in die Zielliste nur erfolgt, wenn die gewünschte Bedingung erfüllt ist. Wie kannst Du in Java eine Bedingung prüfen?
Mit einem If-Statement? Aber was genau überprüf ich in diesem If Statement?
 
Zuletzt bearbeitet:
Ja, if Statement ist schon richtig, aber was genau willst Du prüfen?
Die Aufgabe sagt ja, dass wir nur die PerformanceData Instanzen zurückgegeben haben wollen, welche die pid und tid haben.

Somit musst Du in der Schleife prüfen, ob die aktuelle Instanz (die heisst bei Dir s), die gleiche pid / tid haben.
Und sollte das der Fall sein, willst Du ja nicht die null Referenz hinzu fügen sondern die geprüfte Instanz.

Noch einmal kurz zur Auffrischung:
Java:
for (PerformanceData s: input) {
    // Code der etwas mit s macht
}
Das ist eine for each Schleife. In der Schleife werden alle Elemente von input durchlaufen. Im Schleifendurchgang ist das aktuelle Element in der Variablen s gespeichert.
 
Ja, if Statement ist schon richtig, aber was genau willst Du prüfen?
Die Aufgabe sagt ja, dass wir nur die PerformanceData Instanzen zurückgegeben haben wollen, welche die pid und tid haben.

Somit musst Du in der Schleife prüfen, ob die aktuelle Instanz (die heisst bei Dir s), die gleiche pid / tid haben.
Und sollte das der Fall sein, willst Du ja nicht die null Referenz hinzu fügen sondern die geprüfte Instanz.

Noch einmal kurz zur Auffrischung:
Java:
for (PerformanceData s: input) {
    // Code der etwas mit s macht
}
Das ist eine for each Schleife. In der Schleife werden alle Elemente von input durchlaufen. Im Schleifendurchgang ist das aktuelle Element in der Variablen s gespeichert.
Okay verstanden habe ich das wie du das meinst. Aber wie prüfe ich in einem if Statement die aktuelle Instanz auf vorhanden sein von pid und tid?
 
Wenn PerformanceData eine Methode hat getPid, dann könnte man z.B. prüfen: s.getPid() == pid. Und ebenso bei tid. Aber da ich die Klasse PerformanceData nicht kenne, kann ich dazu nichts sagen.
 
Wenn PerformanceData eine Methode hat getPid, dann könnte man z.B. prüfen: s.getPid() == pid. Und ebenso bei tid. Aber da ich die Klasse PerformanceData nicht kenne, kann ich dazu nichts sagen.
Also PerfomanceData ist ein Record.

public record PerformanceData(String name, String cat, char ph, int pid, int tid, double ts, double duration) {
}

Würde dann

s.Pid() == pid

funktionieren?
 
Ein Record ist doch eine DatenKlasse die erstellt doch die getter und setter selber.
Du brauchst die doch nur benutzen. Konrad hat dir auch schon gesagt wie.


Ja bloß leider funktioniert das nur mit s.pid() und nicht mit s.getPid(). Wie aber kann ich in der Add Methode sagen das pid und tid eingefügt werden sollen?
 

Anhänge

  • Bildschirmfoto 2022-10-24 um 10.08.32.png
    Bildschirmfoto 2022-10-24 um 10.08.32.png
    140,6 KB · Aufrufe: 3
Bei einem Record heißen die Getter so so wie die angegebenen "Parameter" des Records. Also ein s.pid() und s.tid() sollte es geben. Das weicht halt von den üblichen Gettern mit "get" ab (Etwas, das ich nicht gut finde. Ich hätte auch bei records die Getter mit get starten lassen. Aber das ist egal - die Ersteller werden sich dabei auch etwas gedacht haben ...).
 
Bei einem Record heißen die Getter so so wie die angegebenen "Parameter" des Records. Also ein s.pid() und s.tid() sollte es geben. Das weicht halt von den üblichen Gettern mit "get" ab (Etwas, das ich nicht gut finde. Ich hätte auch bei records die Getter mit get starten lassen. Aber das ist egal - die Ersteller werden sich dabei auch etwas gedacht haben ...).
Genau das hab ich jetzt gemacht. Das in der Add Methode ist so richtig? Also ich habe auch Tests und leider schlägt der Fehl.
 

Anhänge

  • Bildschirmfoto 2022-10-24 um 10.20.18.png
    Bildschirmfoto 2022-10-24 um 10.20.18.png
    242,2 KB · Aufrufe: 1
Das sieht jetzt erst einmal gut aus. Dann zeige einmal den Test, der fehlschlägt.

Und es wäre besser, denn Du den Code nicht als Bildschirmfotos sondern wirklich als Code (Text) einfügen könntest. Dazu einfach mal über dem Eingabebereich auf den Knopf </> drücken und da dann den Code hinein kopieren.
 
Ach - ein Fehler ist da natürlich noch. Was für Elemente sollen den hinzu gefügt werden? Was muss da erfüllt sein?

pid UND tid müssen gleich sein oder
pid ODER tid?
 
Ach - ein Fehler ist da natürlich noch. Was für Elemente sollen den hinzu gefügt werden? Was muss da erfüllt sein?

pid UND tid müssen gleich sein oder
pid ODER tid?
Nein die müssen nicht gleich sein sondern, es ist egal ob sie gleich oder ungleich sind. Es sollen nur alle Werte über 0 hinzugefügt werden. Habe noch ein If-Statement für die Überprüfung hinzugefügt (>= 0).
Java:
 public static ArrayList<PerformanceData> filterByIDs(ArrayList<PerformanceData> input, int pid, int tid) {
        ArrayList<PerformanceData> filterListe = new ArrayList <PerformanceData>();

        for(PerformanceData s : input) {
            if(s.pid() == pid || s.tid() ==tid) {  
                if(s.pid() >= 0 || s.tid() >= 0) {  

                    filterListe.add(s);    
                }
            }
        }
        return filterListe;
    }
 
dann ist "== " wohl nicht richtig

was ist ein prüfen auf gröser als 0 ?
oder Ungeich nicht 0
!= in dem Fall so? Aber sollte das überprüfen auf 0 oder positv, nicht in einem weiteren Statement stehen? Beispielsweise so:

Java:
for(PerformanceData s : input) {
            if(s.pid() == pid || s.tid() ==tid) {  
                if(s.pid() >= 0 || s.tid() >= 0) {  

                    filterListe.add(s);    

                }

            }
        }

        return filterListe;
    }
 
Nein die müssen nicht gleich sein sondern, es ist egal ob sie gleich oder ungleich sind. Es sollen nur alle Werte über 0 hinzugefügt werden. Habe noch ein If-Statement für die Überprüfung hinzugefügt (>= 0).
Also das macht so relativ wenig Sinn in meinen Augen.

Schau Dir einmal die Dokumentation genau an, die über der Methode steht. (Das ist in #1 im Bildschirmfoto zu sehen)

Sowohl pid als auch tid sind immer > 0. Das ist ein technisches Detail. Das haben wir hier nicht zu prüfen. Ich zeige das einmal an Hand eines Beispiels:
Du hast eine Liste von Personen mit Alter. Jeder Person hat ein Alter >= 0. (Klar - es kann ja niemand -7 Jahre alt sein!)
Wenn ich nun eine Liste haben will von allen, die noch keine 7 Jahre alt sind, dann muss ich nur prüfen: Alter < 7. Die Prüfung > 0 ist Unsinn.

Und damit dann einmal zurück zu den Parametern: Was steht da? Wie kann man das umsetzen?
 
Also das macht so relativ wenig Sinn in meinen Augen.

Schau Dir einmal die Dokumentation genau an, die über der Methode steht. (Das ist in #1 im Bildschirmfoto zu sehen)

Sowohl pid als auch tid sind immer > 0. Das ist ein technisches Detail. Das haben wir hier nicht zu prüfen. Ich zeige das einmal an Hand eines Beispiels:
Du hast eine Liste von Personen mit Alter. Jeder Person hat ein Alter >= 0. (Klar - es kann ja niemand -7 Jahre alt sein!)
Wenn ich nun eine Liste haben will von allen, die noch keine 7 Jahre alt sind, dann muss ich nur prüfen: Alter < 7. Die Prüfung > 0 ist Unsinn.

Und damit dann einmal zurück zu den Parametern: Was steht da? Wie kann man das umsetzen?
Also im Test werden auch negative Werte getestet. Meinst du im If-Statement?

Java:
 public void testFilterByIDs() {
        ArrayList<PerformanceData> input = Main.readFromCSV("resources/read/students/profiling2.csv");

        Assert.assertEquals(1, Main.filterByIDs(input, 1, 12).size());
        Assert.assertEquals(2, Main.filterByIDs(input, 1, -1).size());
        Assert.assertEquals(2, Main.filterByIDs(input, 7, -1).size());
        Assert.assertEquals(2, Main.filterByIDs(input, -1, 10).size());
        Assert.assertEquals(0, Main.filterByIDs(input, 7, 99).size());
        Assert.assertEquals(7, Main.filterByIDs(input, -1, -1).size());
    }
 
Also im Test werden auch negative Werte getestet. Meinst du im If-Statement?
Hast Du dir die Dokumentation der Methode angesehen, die Du schreiben sollst? Was steht bei den Parametern?

Das Problem hier ist aus meiner Sicht, dass die Anforderung nicht verstanden wurde. Daher schau Dir diese genau an! Und Texte bitte nicht als Bildschirmfoto kopieren - das nervt und macht es uns schwer. Ich werde den Text nicht abtippen, um ihn Dir unter die Nase zu reiben.
 
Hast Du dir die Dokumentation der Methode angesehen, die Du schreiben sollst? Was steht bei den Parametern?

Das Problem hier ist aus meiner Sicht, dass die Anforderung nicht verstanden wurde. Daher schau Dir diese genau an! Und Texte bitte nicht als Bildschirmfoto kopieren - das nervt und macht es uns schwer. Ich werde den Text nicht abtippen, um ihn Dir unter die Nase zu reiben.
Achso habe ich die Aufgabe falsch verstanden? Ich dachte ich muss nur pid und tid wiedergeben in eine neue Liste. Aber soll ich den kompletten Datensatz wiedergeben? Entschuldigung wegen den Screenshots.
 
Dir fehlt noch ein ganz wichtiger Punkt bei der Lösung der Aufgabe. Jetzt tippe ich es doch einmal ab:
@param pid The pid the elements have to have; ignored if -1
@param tid The tid the elements have to have; ignored if -1

Aber soll ich den kompletten Datensatz wiedergeben?
Das hast Du ja schon. Wenn die Prüfung erfolgreich ist, dann fügst Du den ganzen record in die Liste ein. Das ist also gut.

Wahrscheinlich hat es was mit dem ODER zutun?
Ja, das ist ein Punkt. Derzeit prüfst Du noch mit || (oder), aber wenn pid und tid angegeben sind, dann müssen beide stimmen. Das ist also noch ein Fehler und der würde Dir bei der Überprüfung um die Ohren fliegen: Assert.assertEquals(0, Main.filterByIDs(input, 7, 99).size());

Aber erst einmal kannst Du noch den ersten Punkt angehen.
 
Dir fehlt noch ein ganz wichtiger Punkt bei der Lösung der Aufgabe. Jetzt tippe ich es doch einmal ab:
@param pid The pid the elements have to have; ignored if -1
@param tid The tid the elements have to have; ignored if -1


Das hast Du ja schon. Wenn die Prüfung erfolgreich ist, dann fügst Du den ganzen record in die Liste ein. Das ist also gut.


Ja, das ist ein Punkt. Derzeit prüfst Du noch mit || (oder), aber wenn pid und tid angegeben sind, dann müssen beide stimmen. Das ist also noch ein Fehler und der würde Dir bei der Überprüfung um die Ohren fliegen: Assert.assertEquals(0, Main.filterByIDs(input, 7, 99).size());

Aber erst einmal kannst Du noch den ersten Punkt angehen.
Mach ich das nicht mit der Überprüfung ob es eben >= 0 ist? da werden ja alle Datensätze die kleiner als 0 sind ignoriert?
 
Was prüfst Du den Wert des Datensatzes? Wenn der Parameter -1 ist, dann solltest Du den Parameter ignorieren!

Also füll eine Wahrheitstabelle aus für pid:
Code:
DS    P    Ergebnis
x    x    ?
x    <>x    ?
x    -1    ?
Was sind da für die ? einzutragen? Ja bedeutet wird aufgenommen, Nein bedeutet, wird nicht aufgenommen. x steht für einen beliebigen Wert <>x steht für einen beliebigen Wert ausser eben x (und auch nicht -1!).
DS ist der Datensatz, P der Parameter.

Edit: bei <>x ist der Wert nicht x und auch nicht -1! Das -1 hatte ich vergessen und noch eingefügt.
 
Java:
if(s.pid() == pid || s.tid() ==tid) { 
                if(s.pid() >= 0 || s.tid() >= 0) {   // das zweite wird nie geprüft. weil das erste immer False sein wird.

                    filterListe.add(s);
 
Was prüfst Du den Wert des Datensatzes? Wenn der Parameter -1 ist, dann solltest Du den Parameter ignorieren!

Also füll eine Wahrheitstabelle aus für pid:
Code:
DS    P    Ergebnis
x    x    ?
x    <>x    ?
x    -1    ?
Was sind da für die ? einzutragen? Ja bedeutet wird aufgenommen, Nein bedeutet, wird nicht aufgenommen. x steht für einen beliebigen Wert <>x steht für einen beliebigen Wert ausser eben x.
DS ist der Datensatz, P der Parameter.
Java:
DS    P    Ergebnis
x    x    ja
x    <>x    ja
x    -1    nein

so oder? Und danke für die große Hilfe, ich mach das noch nicht so lange...
 
Nein, wir überlegen es uns noch einmal anders.

Stell Dir eine Liste vor mit Autos. Da stehen alle Autos drauf mit der Farbe.
Jetzt sollst Du mir eine Liste mit Autos erstellen, die alle eine Farbe haben, die ich Dir sage. Also Ich sage z.B. "rot", dann listest Du mit alle Autos auf, die rot sind. Aber: Wenn ich sage "egal", dann beachtest Du die Farbe nicht.

Also wenn ich "egal" sage, dann besteht jedes Auto diese "Prüfung", oder?

Wenn Du also die Prüfung machen musst, dann schaust Du: Ist die gewünschte farbe "egal" -> Fertig, Farbcheck ok. Ansonsten prüfst Du noch die Farbe. Die Prüfung wäre also - wenn man dies zusammen fassen würde: gewünschetFarbe == "egal" || auto.farbe = gewünschteFarbe.

So ist es auch bei der pid: Wenn pid == -1 ist, dann wird der Datensatz genommen - unabhängig vom Wert. Also könntest Du - so wie ich für das Auto - nun für die pid eine Bedingung aufstellen.
 
Nein, wir überlegen es uns noch einmal anders.

Stell Dir eine Liste vor mit Autos. Da stehen alle Autos drauf mit der Farbe.
Jetzt sollst Du mir eine Liste mit Autos erstellen, die alle eine Farbe haben, die ich Dir sage. Also Ich sage z.B. "rot", dann listest Du mit alle Autos auf, die rot sind. Aber: Wenn ich sage "egal", dann beachtest Du die Farbe nicht.

Also wenn ich "egal" sage, dann besteht jedes Auto diese "Prüfung", oder?

Wenn Du also die Prüfung machen musst, dann schaust Du: Ist die gewünschte farbe "egal" -> Fertig, Farbcheck ok. Ansonsten prüfst Du noch die Farbe. Die Prüfung wäre also - wenn man dies zusammen fassen würde: gewünschetFarbe == "egal" || auto.farbe = gewünschteFarbe.

So ist es auch bei der pid: Wenn pid == -1 ist, dann wird der Datensatz genommen - unabhängig vom Wert. Also könntest Du - so wie ich für das Auto - nun für die pid eine Bedingung aufstellen.
also heißt es dann:

s.pid() == -1 || s.pid() == pid
 
also heißt es dann:

s.pid() == -1 || s.pid() == pid
Dann würdest Du auf der Auto Liste prüfen:
Stehst bei der Farbe des Autos (von der Liste) "egal" oder steht da die Farbe, die ich gesagt habe.

Aber das ist ja nicht das, was Du willst. Du willst ja prüfen:
Habe ich "egal" gesagt oder steht beim Auto (von der Liste) die Farbe, die ich gesagt habe.
 

Zurück
Oben