Personenverwaltung mit List<>, falsche Ausgaben

Voldemort92

Mitglied
Nabend! Ich sitze gerade an einer Übungsaufgabe, wo man verschiedene Personen in einer Liste speichern und diese dann filtern/sortieren/reduzieren soll. Leider scheint es nicht ganz so zu klappen wie es soll und ich finde meinen Fehler nicht. Wie so oft wird es wohl eine Sache sein, die so klein und unauffällig ist dass ich sie permanent übersehe.

Zu meinem Code: Hier erstmal die Klasse Person, ganz simpel:

Java:
public class Person
{
    private int alter;
    private String name;

    public Person(String name, int alter)
    {
        this.alter = alter;
        this.name = name;
    }

    public int getAlter()
    {
        return alter;
    }

    public String getName()
    {
        return name;
    }

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

    public void setName(String name)
    {
        this.name = name;
    }

    public String toString()
    {
        return name + ", " + alter;
    }
}

Hier dann ein Container, der eigentlich bloß ein paar Beispielpersonen liefert:

Java:
import java.util.*;

public class PersonContainer
{
    private static List<Person> meinePersonen = new ArrayList<>(1);

    public static List<Person> getListe()
    {
        Person p1 = new Person("Weiss",20);
        Person p2 = new Person("Meier",40);
        Person p3 = new Person("Mueller",55);
        Person p4 = new Person("Beyer",37);
        Person p5 = new Person("Albrecht",42);
        Person p6 = new Person("Hansen",56);
        meinePersonen.add(p1);
        meinePersonen.add(p2);
        meinePersonen.add(p3);
        meinePersonen.add(p4);
        meinePersonen.add(p5);
        meinePersonen.add(p6);
        return meinePersonen;
    }
}

Und nun zur UI-Klasse. Die main-Methode sagt ja an sich schon, was sie machen soll.

Java:
import java.util.*;

public class MainUI
{
    private static List<Person> liste = PersonContainer.getListe();

    public static void main(String[] args)
    {
        //Filtern: Alle Personen ausgeben, deren Name auf "er" endet
        for(Person p : filtern1()) System.out.println(p);
        System.out.println("");

        //Filtern: Alle Personen ausgeben, deren Name mit "M" beginnt
        for(Person p : filtern2()) System.out.println(p);
        System.out.println("");

        //Sortieren: Nach Name aufsteigend
        for(Person p : sortieren1()) System.out.println(p);
        System.out.println("");

        //Sortieren: Nach Alter aufsteigend
        for(Person p : sortieren2()) System.out.println(p);
        System.out.println("");

        //Reduzieren: Älteste Person
        System.out.println(reduzieren1());
        System.out.println("");

        //Reduzieren: Person mit längstem Namen
        System.out.println(reduzieren2());
        System.out.println("");
    }
    private static List<Person> filtern1()
    {
        List<Person> filter1Liste = liste;
        for(int i = 0; i< filter1Liste.size(); i++)
        {
            if((((Character)filter1Liste.get(i).getName().charAt(filter1Liste.get(i).getName().length()-2)).equals("e") != true) || (((Character)filter1Liste.get(i).getName().charAt(filter1Liste.get(i).getName().length()-1)).equals("r") != true))
            {
                filter1Liste.remove(i);
                i = i-1;
            }
        }
        return filter1Liste;
    }
    private static List<Person> filtern2()
    {
        List<Person> filter2Liste = liste;
        for(Person p : filter2Liste)
        {
            if(((Character)p.getName().charAt(0)).equals("M") == false) filter2Liste.remove(p);
        }
        return filter2Liste;
    }
    private static List<Person> sortieren1()
    {
        List<Person> sortieren1Liste = liste;
        for(Person p : sortieren1Liste)
        {
            for(Person q : sortieren1Liste)
                {
                    if((p.getName().compareTo(q.getName()) > 0) && (sortieren1Liste.indexOf(p) - sortieren1Liste.indexOf(q) <0))
                    {
                        Collections.swap(sortieren1Liste, sortieren1Liste.indexOf(p), sortieren1Liste.indexOf(q));
                    }
                }
        }
        return sortieren1Liste;
    }
    private static List<Person> sortieren2()
    {
        List<Person> sortieren2Liste = liste;
        for(Person p : sortieren2Liste)
        {
            for(Person q : sortieren2Liste)
                {
                    if((p.getAlter() > q.getAlter()) && (sortieren2Liste.indexOf(p) - sortieren2Liste.indexOf(q) <0))
                    {
                        Collections.swap(sortieren2Liste, sortieren2Liste.indexOf(p), sortieren2Liste.indexOf(q));
                    }
                }
        }
        return sortieren2Liste;
    }
    private static Person reduzieren1()
    {
        List<Person> reduzieren1Liste = liste;
        Person aeltester = new Person("", 0);
        for(Person p : reduzieren1Liste)
        {
            if(p.getAlter() > aeltester.getAlter())
            {
                aeltester.setAlter(p.getAlter());
                aeltester.setName(p.getName());
            }
        }
        return aeltester;
    }
    private static Person reduzieren2()
    {
        List<Person> reduzieren2Liste = liste;
        Person laengster = new Person("", 0);
        for(Person p : reduzieren2Liste)
        {
            if(p.getName().length() > laengster.getName().length()) laengster = p;
        }
        return laengster;
    }
}

Wie vielleicht auffällt, habe ich in den Methoden teilweise andere Lösungsansätze ausprobiert, um zu gucken wo mein Fehler liegt. Leider hat keiner der Ansätze das ausgegeben, was ich erwartet habe. :p

Meine momentane Ausgabe sieht ca. so aus:

Java:
(ein paar leere Zeilen)

, 0
, 0

Danke im Voraus, liebe Grüße
 

Ruzmanz

Top Contributor
Grauenhafter Code :shock:

Du solltest dir die Methoden in der Klasse String genauer ansehen. Deine Lösung ist falsch und es geht deutlich einfacher:
Code:
if(!filter1Liste.get(i).getName().endsWith("er"))

Um zu prüfen, wo das Problem liegt kannst du beliebig viele Konsolenausgaben machen. Dann hättest du auch gesehen, dass filter1() alle Personen rauswirft. So kannst du übrigends deine Methoden schrittweise kontrollieren.
 

stg

Top Contributor
Offenbar filterst du bereits im ersten Aufruf der Methode
Code:
filtern1()
alle Personen aus deiner Liste heraus. Wenn die dann leer ist, wird natürlich auch nix ausgegeben.
 

Voldemort92

Mitglied
Grauenhafter Code :shock:

Hast ja recht... ich denke du meinst die ellenlangen ifs? :D

Du solltest dir die Methoden in der Klasse String genauer ansehen. Deine Lösung ist falsch und es geht deutlich einfacher:
Code:
if(!filter1Liste.get(i).getName().endsWith("er"))

Danke! Hab nicht damit gerechnet, dass sowas wirklich bereitgestellt wird :D Sieht aber wirklich viel schöner aus.

Um zu prüfen, wo das Problem liegt kannst du beliebig viele Konsolenausgaben machen. Dann hättest du auch gesehen, dass filter1() alle Personen rauswirft. So kannst du übrigends deine Methoden schrittweise kontrollieren.

Das hab ich schon gemerkt. Ich hatte/hab nur keinen Plan warum. Das was in der if-Anweisung was nicht hinhaut hab ich schon vermutet, aber wirklich einen Fehler gefunden hab ich nicht.

Außerdem dachte ich eigentlich, dass ich ein Leeren der Liste verhindere, indem ich meine Liste in jeder Methode in eine Hilfsliste packe (die dann für die nachfolgenden Methoden auch schon halb zerpflückt sein darf, da sie dort nicht mehr gebraucht wird). Aber scheinbar haben meine Hilfslisten alle nur auf meine Hauptliste referenziert und waren somit von der Filterung betroffen? Hatte ich so eigentlich nicht erwartet, aber man lernt ja nie aus.

edit: hat sich geklärt, war wie erwartet so ein kleiner Fehler, hab einfach bei meinen Hilfslisten das "new ArrayList<>(1)" vergessen... danach kann man die Hauptliste ohne Probleme in die Hilfslisten reinadden. Danke an alle Antworter!
 
Zuletzt bearbeitet:

Natac

Bekanntes Mitglied
Zudem solltest du mal überlegen, ob du deine Methoden wirklich "filtern1", "sortieren1" und "reduzieren1" nennen willst. Wie wäre es mit "endsWithEr", "sortByNameAsc", "oldestPerson".

Zudem wäre das Ganze flexibler, wenn du die Liste der Personen der Methode übergeben würdest, statt sie sich intern zu holen. Damit wären deine Sortier-Methoden unabhängig von MainUI (weil sie das interne
Code:
static list
nicht mehr benötigen), und du könntest sie für beliebige Personen-Listen einsetzen.Ist natürlich die Frage, ob du das brauchst.

Was du aber auf jeden Fall machen solltest, ist die Methoden umzubenennen. Vielleicht sogar mit Parametern.
Code:
List<Person> endsWith(String suffix)
ist doch viel sprechender als
Code:
List<Person> filtern1()
. ;)
 

Voldemort92

Mitglied
Da hast du natürlich recht, allerdings habe ich mich an die Vorgaben der Übungsaufgabe gehalten (es hat keinen weiteren Zweck / Verwendung, von daher ist es auch nicht so wichtig). ^^
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Best Practice Java Personenverwaltung Java Basics - Anfänger-Themen 19
T User input in Verbindung mit ChronoUnit anpassen und falls falsche Eingabe getätigtwird Java Basics - Anfänger-Themen 7
B Binärzahlen auflisten, falsche Ausgabe? Java Basics - Anfänger-Themen 1
Z Java ArrayList speichert falsche Daten ab bzw. gibt falsche Daten aus? Java Basics - Anfänger-Themen 42
volcanos HashSet und Iterator -> Falsche Sortierreihenfolge ? Java Basics - Anfänger-Themen 18
O Falsche Antworten zu Fragen Java Basics - Anfänger-Themen 4
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
D falsche eingabe erkennen Java Basics - Anfänger-Themen 2
F Wieso wird immer die falsche Mausposition angegeben? Java Basics - Anfänger-Themen 1
JaVaN0oB Wörterraten - Falsche Ausgabe, String/Chars vergleichen Java Basics - Anfänger-Themen 2
H Falsche Ausgabe Java Basics - Anfänger-Themen 2
K falsche Eingabe abfangen Java Basics - Anfänger-Themen 8
L Falsche Methode wird geladen Java Basics - Anfänger-Themen 2
T JLabel hat falsche größe Java Basics - Anfänger-Themen 1
H Swing Button hat falsche Größe Java Basics - Anfänger-Themen 5
T Input/Output Falsche Eingabe ausgeben Java Basics - Anfänger-Themen 3
R StringBounds falsche Ergebnisse Java Basics - Anfänger-Themen 5
D Falsche Zeile wird in JTable gelöscht Java Basics - Anfänger-Themen 6
W Array in String und String in Array - falsche Ausgaben Java Basics - Anfänger-Themen 20
T Falsche Ausgabe ???? Java Basics - Anfänger-Themen 13
S Falsche Ausgabe Java Basics - Anfänger-Themen 6
M Input/Output ISBN Leser - falsche Eingabe ausgeben Java Basics - Anfänger-Themen 2
R Methoden Switch wählt das Falsche Java Basics - Anfänger-Themen 17
K Falsche Methode Java Basics - Anfänger-Themen 3
J Falsche Darstellung von Float Java Basics - Anfänger-Themen 2
M Falsche Eingabe wiederholen lassen Java Basics - Anfänger-Themen 2
W Methoden Falsche Felder von Methode belgegt Java Basics - Anfänger-Themen 14
M falsche implementierung von currentTimeMillis() ? Java Basics - Anfänger-Themen 14
F charAt-Methode liefert falsche Unicode-Werte Java Basics - Anfänger-Themen 8
P Falsche Werte bei Zeitmessungen Java Basics - Anfänger-Themen 7
Helgon Falsche Zeichen im Text Java Basics - Anfänger-Themen 10
S Parameterübergabe - identische Funktionen, aber falsche Funktion Java Basics - Anfänger-Themen 5
G Bubblesort - Falsche Sortierung Java Basics - Anfänger-Themen 6
D Kriege falsche MD5 Java Basics - Anfänger-Themen 12
R run ->eclipse ruft falsche Programme auf Java Basics - Anfänger-Themen 5
D p q formel gibt zum Teil falsche Werte aus Java Basics - Anfänger-Themen 5
S Falsche Version? Java Basics - Anfänger-Themen 2
C Falsche Zeit Java Basics - Anfänger-Themen 2
V Falsche Augabe Java Basics - Anfänger-Themen 16
C Klammern einlesen!!! Falsche Ausgabe!!!! Java Basics - Anfänger-Themen 4
S Falsche Reihenfolge von Methodenaufrufen Java Basics - Anfänger-Themen 8
H Falsche Eingabe über try-catch abfangen Java Basics - Anfänger-Themen 2
K Verschiebeoperatoren - manchmal falsche Ergebnisse Java Basics - Anfänger-Themen 7
L Datenbankanbindung ODBC falsche pfadangabe? Java Basics - Anfänger-Themen 3
O Falsche Bed. (ein überlauf) seh den Fehler aber nicht. Java Basics - Anfänger-Themen 3
G static array liefert falsche Werte zurück Java Basics - Anfänger-Themen 2
S Falsche Ausgabe Java Basics - Anfänger-Themen 3
L Wegen TableSorter wird falsche Zeile einer Tabelle gelöscht? Java Basics - Anfänger-Themen 2
G falsche Version Java Basics - Anfänger-Themen 3
L Falsche Umsetzung von MVC, brauche Hilfe Java Basics - Anfänger-Themen 6
D Tabelle -> Daten eingeben -> Falsche erhalten Java Basics - Anfänger-Themen 9
S Falsche Ausgabe? Java Basics - Anfänger-Themen 2
F Falsche Daten aus Datei Java Basics - Anfänger-Themen 2
G Falsche Java befehle, doch was ist falsch? Java Basics - Anfänger-Themen 9
C falsche Eingabe abfangen Java Basics - Anfänger-Themen 8
M Falsche do-Schleife? Java Basics - Anfänger-Themen 4
E falsche Ausgabe Java Basics - Anfänger-Themen 7
D Falsche Datumsausgabe? Java Basics - Anfänger-Themen 5
J erhalte falsche Kalenderwoche - wo ist der Fehler? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben