Methoden Klassenmethode Liste ausgeben/ for-Schleife und Slüsselattribut

macadamia

Mitglied
Hallo, vorab. ich bin blutiger Anfänger, daher bitte ich um Nachsicht.
In meiner Aufgabenstellung soll ich ein Karteisystem (Inhalt Freunde) erstellen. Ohne Interface, einfach nur statisch. Ein Teil der Aufgabe ist es die Freunde auszugeben. Bei dieser kleinen Anforderung habe ich auf die Sichtbarkeiten vorerst verzichtet. Somit habe ich auch keine get- und set-Methoden eingebaut. Der Rahmen der Ausarbeitung ist leider sehr begrenzt.
Ich habe nun Folgendes gemacht.
Klasse Freund erstellt:

Java:
class Freund {
    
String name;
String vorname;
String geburtsdatum;  //localDate habe ich auch erstmal raus gelassen. Wenn ich später noch platz habe werde ich das auch noch einbauen
String telefonnummer;
String mobil;
String email;
int plz;
String ort;
String strasse;
int hausnummer;
String zusatz;
//Konstruktor
Freund(String name, String vorname, String geburtsdatum, String telefonnummer, String mobil,
        String email, int plz,String ort, String strasse, int hausnummer, String zusatz){
        
    this.name = name;
    this.vorname = vorname;
    this.geburtsdatum = geburtsdatum;
    this.telefonnummer = telefonnummer;
    this.mobil = mobil;
    this.email = email;
    this.plz = plz;
    this.ort = ort;
    this.strasse = strasse;
    this.hausnummer = hausnummer;
    this.zusatz = zusatz;
    
    }
//Methode zur Ausgabe von Freunden
void freundAusgeben() {
    System.out.println("Name: " + name);
    System.out.println("Vorname " + vorname);
    System.out.println("Geboren am: " + geburtsdatum);
    System.out.println("Telefonnummer: " + telefonnummer);
    System.out.println("-----");        
    }
}

In der Main-Methode habe ich ein paar Beispielobjekte erzeugt. Die Objekte habe ich aufgrund der Aufgabenstellung in einer Array Liste eingebracht, es ist vorher nicht bekannt wie viel Freund-Objekte instanziert werden sollen.
Java:
import java.util.ArrayList;
import java.util.List;

public class Kartei {
    
public static void main(String [] args) {
    
    Freund freund1 = new Freund("Müller", "Daniel", "01.02.1990", "0228-33540", "0170-5406548", "daniel@mueller.de", 53113, "Bonn", "Hauptstraße", 159, "a"); 
    Freund freund2 = new Freund("Maier", "Bernd", "05.08.1950", "0228-558743", "0164-8650333", "bernd@maier.de", 53119, "Bonn", "Quantiusstraße", 123, "");  
    Freund freund3 = new Freund("Thull" ,"Diana", "19.11.1982", "0221-1233098", "0165-3334789", "diana@thull.de", 50676, "Köln", "Industriestraße", 337, "c");
    Freund freund4 = new Freund("Riel" ,"Sabine", "03.11.1979", "0221-7998035", "0164-9163455", "sabine@Riel.de", 50676, "Köln", "Am Neumarkt", 5, "");
   
    List<Freund> liste = new ArrayList<Freund>();
    
    liste.add(freund1);
    liste.add(freund2);
    liste.add(freund3);
    liste.add(freund4);
  
    for (int i = 0; i < liste.size(); i++){
          
        freund1 = liste.get(i);
        
        //Methode um die Position der Freunde abzurufen
        //System.out.println("An der Stelle "+i + " ist Freund " +freund1.vorname);

        freund1.freundAusgeben();   //diese Methode verstehe ich nicht!
        
        }
    
    //freund1.freundAusgeben();
    
    }
   
}

Ich habe jetzt hier die Methode an zwei Stellen angebracht. Die Methode, die ich mit den // deaktiviert habe würde richtigerweise einzelne Freunde ausgeben können. Aber die andere freundAusgeben Methode verstehe ich einfach nicht. Wenn ich freund1.freundAusgeben() ausführe werden alle Freunde in dem richtigen Format ausgegeben. Wenn ich nun freund2.freundAusgeben() ausführe wird vier mal Bernd Maier ausgegeben. Warum ist das so?
Wie würdet ihr alle Freunde ausgeben? mit meiner Methode freund1.freundAusgeben() ist das ja eher irreführend.

Eine Weitere Anforderung der Arbeit ist jedem Freund ein eineindeutiges Erkennungsmerkmal zu verpassen. Ich habe mir darüber auch Gedanken gemacht. Über die Array Liste hätte jedes Objekt eine Position in dem Array aber das Problem ist, wenn ich bsw. liste.remove(1) eingebe um den freund2 Bernd rauszunehmen, würde die Position ja einfach neu vergeben werden. Habt ihr da eine Idee wie ich das besser lösen könnte?

Danke schon mal im Voraus
MfG
 

MoxxiManagarm

Top Contributor
Dein Problem ist, dass du die Referenz freund1 wiederverwenden willst. Das ist so keine gute Idee. Versuch die Referenzen mit ihrem Verwendungszweck gut zu trennen. Die Anzahl deiner Referenzen kannst du auch minimieren, was dir dabei hilft.

Java:
    List<Freund> freunde = new ArrayList<>();
    
    liste.add(new Freund("Müller", "Daniel", "01.02.1990", "0228-33540", "0170-5406548", "daniel@mueller.de", 53113, "Bonn", "Hauptstraße", 159, "a"));
    liste.add(new Freund("Maier", "Bernd", "05.08.1950", "0228-558743", "0164-8650333", "bernd@maier.de", 53119, "Bonn", "Quantiusstraße", 123, ""));
    liste.add( new Freund("Thull" ,"Diana", "19.11.1982", "0221-1233098", "0165-3334789", "diana@thull.de", 50676, "Köln", "Industriestraße", 337, "c"));
    liste.add(new Freund("Riel" ,"Sabine", "03.11.1979", "0221-7998035", "0164-9163455", "sabine@Riel.de", 50676, "Köln", "Am Neumarkt", 5, ""));
  
    for (int i = 0; i < freunde.size(); i++) {
        freunde.get(i).freundAusgeben();    
    }

Anstatt der einfachen for-Schleife, wäre für deinen Fall auch eine foreach-Schleife gut

Java:
    for (Freund freund : freunde) {
        freund.freundAusgeben();    
    }
 

macadamia

Mitglied
Hallo nochmal,
Danke für deine Hilfe. Ich hab nun noch ein Problem. Ich habe versucht den Code umzuschreiben, ich musste eine Klasse Kartei mit hinzu nehmen. Bei der Gelegenheit hab ich auch Get- und Set- Methoden hinzugefügt. Jeder den ich gefragt habe meinte das wäre nicht so gut wenn ich an der Stelle Code spare.
Ich komme aber nun leider nicht drauf was ich hier falsch gemacht habe. Also wie gesagt, die Klasse Freund oben ist weitestgehend gleich nur das jedes Attribut nun private ist und unten drunter die Get-/Set-Methoden hinzugefügt wurden.
Dann habe ich die Klasse Kartei erstellt:
Java:
package Objekte;
import java.util.List;

public class kartei {
       
    private List<Freund> freundListe; //freundesliste deklariert
    
    public kartei() {} //Default Konstruktor
    
    public kartei(List <Freund> abcListe) { // Konstruktor
        this.freundListe = abcListe;
    }

    public List<Freund> getFreundListe() { //getter
        return freundListe;
    }

    public void setFreundListe(List<Freund> freundListe) { //setter
        this.freundListe = freundListe;
    }
   
}
Bitte nicht wundern, die Kommentare helfen mir als Anfänger.

Dann habe ich versucht eine Ausgabe zu erstellen.
Java:
package analyse;

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

import Objekte.Freund;
import Objekte.kartei;

public class ausgabe {
    
    public static void main(String [] args) {
        
        //Methode um ein Objekt in der Klasse Kartei zu erstellen
        List<Freund> listeVonPersonen = erstelleEineListeVonPersonen();
        kartei kartei = new kartei();
        kartei.setFreundListe(listeVonPersonen);
                
        //Methode um die gesamte Liste auszugeben
        List<Freund> freundListe = kartei.getFreundListe();        
        System.out.println(freundListe);
        
/*        for (int i = 0; i < listeVonFreunden.size(); i++){
              
            freund1 = listeVonFreunden.get(i);
              
            System.out.println("An der Stelle "+i + " ist Freund " +freund1.vorname);
        }      */
        
    }
        
    public static List<Freund> erstelleEineListeVonPersonen() {
        ArrayList<Freund> listeVonFreunden = new ArrayList<>();
        
        Freund freund1 = new Freund("1", "Müller", "Daniel", "01.02.1990", "0228-33540", "0170-5406548", "daniel@mueller.de", 53113, "Bonn", "Hauptstraße", 159, "a");
        Freund freund2 = new Freund("2", "Maier", "Bernd", "05.08.1950", "0228-558743", "0164-8650333", "bernd@maier.de", 53119, "Bonn", "Quantiusstraße", 123, "");  
        Freund freund3 = new Freund("3", "Thull" ,"Diana", "19.11.1982", "0221-1233098", "0165-3334789", "diana@thull.de", 50676, "Köln", "Industriestraße", 337, "c");
        Freund freund4 = new Freund("4", "Riel" ,"Sabine", "03.11.1979", "0221-7998035", "0164-9163455", "sabine@Riel.de", 50676, "Köln", "Am Neumarkt", 5, "");
    
        listeVonFreunden.add(freund1);
        listeVonFreunden.add(freund2);
        listeVonFreunden.add(freund3);
        listeVonFreunden.add(freund4);
        
        return listeVonFreunden;
    }

ich habe jetzt die Schleife auskommentiert. Ich hatte es zuvor auch mit der foreach-Schleife getestet. Aber ich bekomme partout keinen Zugriff auf einzelne Attribute. selbst wenn ich einfach versuche freund1.getName(); auszugeben.
Könnt ihr mir das bitte erklären?
 

fhoffmann

Top Contributor
Deine Klasse kartei (am Rande: Klasennamen schreibt man in Java gross, also sollte die Klasse Kartei heißen) hat die falschen Methoden. Die beiden get- und set-Methoden würde ich löschen, die Liste (im Konstruktor oder bei der Deklarierung) initialisieren und etwa folgende Methoden hinzufügen:
Java:
public void add(Freund freund) {
  // ...
}
public void printAll() {
  // ...
}
public Freund findById(int id) {
  // ...
}
public Freund findByVorname(String vorname) { // mal wieder eine schöne Mischung aus english und teutsch
  // ...
}
In der main bzw. in der Methode erstelleEineListeVonPersonen (schöne Idee, dafüf eine eigene Methode zu schreiben!) würde ich keine eigenen Variablen für jeden Freund anlegen (freund1, freund2 etc) (siehe auch den Beitrag von MoxxiManagarm), sondern beispielsweise aufrufen:
Java:
meineKartei.add(new Freund(....));
 

macadamia

Mitglied
Hallo,
Danke für eure Hilfe. Ich habe nun versucht das einigermaßen umzusetzen. Ich habe die Variablen rausgenommen wie MoxxiManagarm das auch schon vorgeschlagen hatte. Die Get-/Set-Methode bei der Klasse Kartei habe ich auch rausgenommen und natürlich habe ich den Klassennamen korrigiert.
Die findById bzw. findbyVorname (ist ja im Grunde genommen das Selbe) habe ich soweit hinbekommen. Add + in die Liste hinzufügen hat auch grade noch geklappt.
Ich bin mir nur nicht ganz sicher wie ich die Liste bereits in der Deklarierung oder im Konstruktor initialisieren kann.
Es kann sein das dies zu meinem nächsten Problem führt. Bei den Ausgaben bekomme ich keine Informationen über die Objekte sondern nur die Speicherorte.
aktuell sieht die Klasse Kartei so aus:
Java:
package Objekte;
import java.util.List;

public class Kartei {
       
    public List<Freund> freundListe; //freundesliste deklariert
    
    public Kartei() {} //Default Konstruktor
        
    public Kartei(List <Freund> freundListe) { // Konstruktor
        this.freundListe = freundListe;
    }
   
}

und die Mainmethode + Methoden so:

Code:
package Analyse;

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

import Objekte.Freund;
import Objekte.Kartei;

public class Hauptteil {
    
    public static void main(String [] args) {
        
        //Methode um ein Objekt in der Klasse Kartei zu erstellen
        List<Freund> listeVonPersonen = erstelleEineListeVonPersonen();
        Kartei kartei = new Kartei();
        kartei.freundListe = listeVonPersonen;
                        
        //Methode um die gesamte Liste auszugeben
        List<Freund> freundListe = kartei.freundListe;       
        System.out.println(freundListe);
                
        for(Freund ausgabe : kartei.freundListe) {
            System.out.println(ausgabe);
        }
        
        for (int i = 0;i< kartei.freundListe.size();i++){
            System.out.println(kartei.freundListe.get(i));
        }
        
        Freund createNewFreund = createNewFreund();
        hinzufuegenFreund(listeVonPersonen, createNewFreund);
        
        //Methode um nach Freunden zu Suchen nach ID
        Freund suchePersonenNachId = suchePersonenNachId(listeVonPersonen, "5");
        System.out.println(suchePersonenNachId);
        
    }

    public static List<Freund> erstelleEineListeVonPersonen() {
        ArrayList<Freund> listeVonFreunden = new ArrayList<>();
        
        listeVonFreunden.add(new Freund("1", "Müller", "Daniel", "01.02.1990", "0228-33540", "0170-5406548", "daniel@mueller.de", 53113, "Bonn", "Hauptstraße", 159, "a"));
        listeVonFreunden.add(new Freund("2", "Maier", "Bernd", "05.08.1950", "0228-558743", "0164-8650333", "bernd@maier.de", 53119, "Bonn", "Quantiusstraße", 123, ""));
        listeVonFreunden.add(new Freund("3", "Thull" ,"Diana", "19.11.1982", "0221-1233098", "0165-3334789", "diana@thull.de", 50676, "Köln", "Industriestraße", 337, "c"));
        listeVonFreunden.add(new Freund("4", "Riel" ,"Sabine", "03.11.1979", "0221-7998035", "0164-9163455", "sabine@Riel.de", 50676, "Köln", "Am Neumarkt", 5, ""));
        
        return listeVonFreunden;
    }
    
    private static Freund createNewFreund() {
        return new Freund("5", "name", "vorname", "geburtsdatum", "telefonnummer", "mobil", "email", 55555, "ort", "strasse", 15, "");
    }
    
    private static void hinzufuegenFreund(List<Freund> listeVonPersonen, Freund freund) {
        listeVonPersonen.add(freund);
    }
    
    private static Freund suchePersonenNachId(List<Freund> freundListe, String id) {
        
        for (Freund freund : freundListe) {
            if (freund.getId().equals(id)) {
                return freund;
            }
        }
        return null;
    }
    
    public void printAll() {
            
    }   
}
Sorry das die Mainmethode ein bisschen unaufgeräumt ist. Ich hab die Ausgaben auf verschiedenen Wegen getestet.

Meine Console gibt da immer das aus:
[Objekte.Freund@7852e922, Objekte.Freund@4e25154f, Objekte.Freund@70dea4e, Objekte.Freund@5c647e05]
Objekte.Freund@7852e922
Objekte.Freund@4e25154f
Objekte.Freund@70dea4e
Objekte.Freund@5c647e05
Objekte.Freund@7852e922
Objekte.Freund@4e25154f
Objekte.Freund@70dea4e
Objekte.Freund@5c647e05
Objekte.Freund@33909752

die Dubletten kommen natürlich durch die verschiedenen Ausgabemethoden von mir.
 

macadamia

Mitglied
einen weiteren Teil habe ich auch noch hinbekommen

Code:
//Methode
    private static String loescheFreundNachId(List<Freund> freundList, String id) {
        for (Freund freund : freundList) {
            if(freund.getId().equals(id)) {
                freundList.remove(freund);
                return "wurde erfolgreich gelöscht";
            }
        }
        return "Konnte nicht gelöscht werden, da nicht existiert";
    }
//Aufruf
String loscheFreundNachId = loescheFreundNachId(listeVonPersonen, "2");
        System.out.println(loscheFreundNachId);

eigentlich auch sehr ähnlich wie findById nur mit ein bisschen Spielerei drumherum.
 

mihe7

Top Contributor
Get- und Set- Methoden
Kurz: Getter und Setter :)

Bei den Ausgaben bekomme ich keine Informationen über die Objekte sondern nur die Speicherorte.
Jede Klasse in Java ist implizit von der Klasse Object abgeleitet, die eine toString() Methode derart definiert, dass die Ausgabe in der Form erfolgt, wie Du sie siehst. Um das zu ändern, musst Du lediglich in Klasse Freund die toString()-Methode überschreiben und einen sinnvollen String zurückgeben.
 

macadamia

Mitglied
ok, Getter/Setter - Abkürzung gemerkt Danke :) Ich hab es schon in einigen Videos gehört, aber ich wusste einfach nicht ob das auch so bei allen verstanden wird.
toString()-Methode, genau das war das Stichwort was mir fehlte. Da Eclipse das automatisch hinzufügen kann (und man es dann noch umstrukturieren kann) ist das ja richtig einfach. Danke dafür.
 

Neue Themen


Oben