Ausgabe einer ArrayList ensteht nur als Hashcode, nicht als Objekt

Miez

Mitglied
Hallo zusammen,

vielleicht ist hier ja jemand, der mit einen kurzen Tipp geben kann. Ich habe eine ArrayList (Name: freunde) implementiert, die Freunde speichert (Vorname, Name, Geburtsdatum, Adresse). Nun möchte ich die Liste ausgeben lassen.

Die Liste ist in eine Methode gepackt (getFreundesliste), damit ich sie woanders aufrufen kann und per GUI ausgeben. Das funktioniert alles....

Der Code ist

Java:
   public ArrayList getFreundesliste() {
            for (int i = 0; i < freunde.size(); i++) {
               Freund f = (Freund) freunde.get(i);
            }
        return freunde;
    }

Die Liste wird mir ausgegeben, allerdings sind die einzelnen Einträge nur Hashcodes,
also statt:
Beispielvorname, Beispielname, Beispieldatum, Beispieladresse erhalte ich Freund@46daef40 etc.

Ich glaube, es liegt daran, dass ich irgendwie nicht die Objekte ausgebe.
Hat jemand einen Tipp? Fehlt bei der for-Schleife noch etwas?

Vielen lieben Dank!
 

LimDul

Top Contributor
Wenn du ein Objekt auf der Konsole ausgibst, wird automatisch die toString() Methode aufgerufen. Wenn man die nicht überschreibt, greift die Standardimplementierung aus Object, die einfach den Klassennamen + hashCode ausgibt.

Spring, um eine schöne String-Darstellung zu erreichen solltest du die toString() Methode passend überschreiben.
 

KonradN

Super-Moderator
Mitarbeiter
Also erst einmal sollte der gegebene Code gar nichts ausgeben. Was soll der Code machen? Wenn Du - so wie der Name aussagt - nur die Freundesliste zurück geben willst, dann kann die Schleife ganz weg und ein return freunde; ist alles, was Du brauchst.

Wenn die Methode auch die Ausgabe machen sollte (das wäre aber dann doch eigentlich eine print Methode sein. Da wäre eine Schleife so wie Die vorhandene Schleife richtig. aber in der Schleife müsste dann noch eine Ausgabe sein wie System.out.println(f);
Zu dem Problem:
Es scheint, dass Du ein Freund einfach ausgibst. Um den String eines Objektes für die Ausgabe zu erhalten, wird die Methode toString() aufgerufen. Die toString() Methode von Object gibt immer den Klassennamen@Hashcode aus. Das erklärt die Ausgabe, die Du bekommst. Wenn Du eine andere Ausgabe bei der Ausgabe eines Freundes haben willst, dann musst Du in der Klasse Freund die toString() Methode überschreiben.
 

Miez

Mitglied
Danke werde ich gleich versuchen!

p.s. der Code gibt etwas aus, denn ich rufe die Methode mit einem JOptionsPane GUI auf, und bekomme dann in meinem kleinen Fenster die Liste der Hashcodes statt der Attribute von Freund. Aber danke für den Hinweis, das hatte ich vergessen zu kommunizieren

Hat geklappt, super, danke!
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
p.s. der Code gibt etwas aus, denn ich rufe die Methode mit einem JOptionsPane GUI auf, und bekomme dann in meinem kleinen Fenster die Liste der Hashcodes statt der Attribute von Freund. Aber danke für den Hinweis, das hatte ich vergessen zu kommunizieren
Dann kannst Du die Schleife dort komplett heraus nehmen nehme ich mal an. Denn die Schleife macht unter dem Strich nichts. Du brauchst dann vermutlich nur die Rückgabe der Liste der Freunde.

Und was auch noch auffällt: Habt Ihr das Thema Generics behandelt? Du verwendest eine ArrayList ohne Angabe eines generischen Typs, womit Du hier eine Typsicherheit weggibst was sich u.a. durch einen notwendigen cast in der Zuweisung in der Schleife.
 

Miez

Mitglied
Vielen Dank!
Wir haben ziemlich viel behandelt, u.a. Generics. Allerdings hat meine Uni nur einen vorab aufgenommenen Videokurs zur Verfügung gestellt ohne die Möglichkeit von Rückfragen. Nun ist ein Programm gefordert, und als Anfänger schwimme ich ein wenig ;-) Ich werde mich dann wohl nochmal mit den Generics auseinandersetzen, ich dachte, das sei für eine solche Aufgabenstellung nicht ganz so wichtig...
 

mihe7

Top Contributor
Nur, damit Du weißt, wie so etwas aussehen kann:
Java:
class XYZ {
    private List<Freund> freunde = new ArrayList<>();

    public void add(Freund freund) {
        freunde.add(freund);
    }

    public Freund get(int ix) {
        return freunde.get(ix);
    }

    public void zeigeFreunde() {
        for (Freund freund : freunde) { // for-each-Schleife
            System.out.println(freund); // wenn toString überschrieben wurde
        }
    }
}
 

Miez

Mitglied
Ah, da fällt mir noch ein: könnte ich prinzipiell meine for-Schleife so erweitern, dass sie, wenn keine Freunde in der Liste stehen, mittels try-catch eine Ausgabe wie: Sorry, you're alone oder sowas ausgibt? Oder muss ich das dann in eine extra Methode packen?

Und benötige ich das Generics, um sozusagen meiner Array List verschiedene Datentypen übergeben zu können? Momentan gebe ich auch das Geburtsdatum wie alles anders als String ein, aber das wäre natürlich als Datumsformat praktischer. Kann eine Array List verschiedene Datentypen enthalten wenn ich Generics verwende?
 

KonradN

Super-Moderator
Mitarbeiter
Du kannst einfach abfragen, wie viele Elemente in der Liste sind und dann kannst du entscheiden, ob du durch die Liste gehst oder ob du eine andere Meldung ausgibst.

Aber evtl. zeigst du einmal deinen Code (ruhig in einem Gespräch wenn du nicht zu viel öffentlich zeigen willst), denn irgend etwas stimmt noch nicht bei dem, was du bisher so zeigst ….

Ich bin auch gerade noch unterwegs, aber ich schreibe nachher noch kurz etwas mehr zu
  • Generics
  • Trennung von Ausgabe und Model
 

Miez

Mitglied
Ich schätze die Mühe sehr, sie müssen sich aber natürlich nicht so viel Zeit nehmen, werde selbst auch noch nach Generics recherchieren.
Freue mich aber natürlich über jeden Input.
So privat ist mein Code nicht ;-)

Aber was ist denn diese Gesprächsoption? Kann man eine (kostenpflichtige?) Beratung buchen oder wie funktioniert das?

Prinzipiell funktioniert sogar alles so wie es soll :) Ich kann meine "Freunde" in einer txt-Datei speichern und wieder abrufen, kann diese durchsuche, Freunde hinzufügen, Freunde löschen, die Anzahl der Freunde ausgeben, eine Liste der Freunde mit individuellem ID-Zähler ausgeben... und das ganze sogar grafisch mit JOption Pane.

gerade beiße ich mir eben an diesen vermeintlichen Kleinigkeiten (oder auch nicht so kleinen Fragen) die Zähne aus....
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Generics dienen der Typsicherheit. Eine List (ohne Typparameter, sog. raw type) kann beliebige Objekte aufnehmen, deswegen liefert get() ein Object, das Du auf Freund casten musst. Wenn man aber etwas in eine Liste steckt, das sich nicht zu Freund casten lässt, fliegt beim Versuch, auf Freund zu casten eine Exception. Das passiert aber erst zur Laufzeit. Mit Generics gibt man dem Compiler konkrete Informationen zum Typ, und der prüft das gnadenlos ab, so dass derartige Fehler schon zum Zeitpunkt der Übersetzung verhindert werden.
 

KonradN

Super-Moderator
Mitarbeiter
Aber was ist denn diese Gesprächsoption? Kann man eine (kostenpflichtige?) Beratung buchen oder wie funktioniert das?
Das ist einfach nur im Forum eine private Nachricht. Einfach einmal auf den Namen klicken und dann im PopUp auf den Knopf "Gespräch beginnen".

Bezüglich Generics nur eine absolute Minimal-Einführung um Klassen, die Generics anbieten, zu nutzen. Eine Recherche und auch ein "selbst probieren" ist wichtig, um dann auch Generics in eigenen Klassen zu nutzen. Aber den Aspekt behandel ich nicht. Aber ehe es los geht, erst noch ein anderes Thema: Wie kann man es selbst lernen?

Du hast angesprochen, dass die Lernunterlagen evtl. nicht ausreichend sind. Daher als erstes ein Hinweis auf ein Buch, das Du Dir einmal ansehen kannst (Findest Du mit etwas Glück in der Bibliothek der Uni!):
Java von Kopf bis Fuß - das ist ein Buch, welches sehr bildlich Java erklärt. Es werden nicht die neuesten Features erläutert, aber Du bekommst ein solides Fundament der Sprache Java. Das Buch ist wohl das am meisten empfohlene Buch für Einsteiger.
Wenn Java dann soweit verstanden wurde, dann ist das Buch "Entwurfsmuster von Kopf bis Fuß" eine sehr lohnende Lektüre.


Generics
Mit Generics kannst Du genauer spezifizieren, was eine Klasse für andere Klassen verwenden soll. Die ArrayList bei Deinem Code ist ein gutes Beispiel:
Arraylist freunde = new ArrayList();
Hier hast Du dann jetzt eine Liste, in der Du beliebige Dinge speichern kannst. Du kannst da also Instanzen von deiner Klasse Freund hinein packen aber auch beliebige andere Instanzen. Das wird also nicht überprüft und sorgt dafür, dass Du nach dem Auslesen eines Elements diesen Cast zu Freund gebraucht hast. Und wenn Du da in der Liste irgendwo auch ein Auto abgelegt hast, dann fliegt da leider eine Exception. Das kann durch Angabe einer Typvariable genau spezifiziert werden:
Arraylist<Freund> freunde = new ArrayList<>();
(Beim der Initialisierung kann der Typ weggelassen werden - er nimmt automatisch den Typ von der Deklaration der Variable. Aber auch da könntest Du <Freund> schreiben.)
Jetzt kannst Du nur noch Instanzen von Freund (oder davon abgeleitet) ablegen. Und bei dem Aufruf von get ist klar: Es wird ein Freund zurück gegeben, daher brauchst Du diesen Cast nicht mehr.

Generell sollte man hier immer eine Typ spezifizieren, damit man bezüglich der Typen sicher ist. Denn jetzt kann der compiler meckern, wenn Du versuchst, ein Auto zuzuweisen.

Trennung UI von Model
Du solltest die Ein- und Ausgabe nicht mit dem sogenannten Model vermengen. Wenn Du also eine Klasse Freundesliste hast, dann hält die nur die Freunde vor, d.h. Du hast nur Methoden um Freunde hinzu zu fügen, zu entfernen oder zu suchen oder so. Aber Du hast keine Ausgabe oder so. Das hat den Vorteil, dass Du diese Klassen universell nutzen kannst. Es ist egal, ob Du eine Konsolenanwendung, UI-Anwendung oder Web Anwendung hast.
Wenn Du also jetzt einen Freund ausgeben willst (egal ob auf der Konsole oder in einem Dialogfenster oder so), dann ist das eine eigene Klasse. Und da kann dann eine Methode sein wie print oder printFreund. Also etwas wie:
Java:
public class FreundIO {
    public void print (Freund freund) {
        StringBuilder output = new StringBuilder();
        output.append(freund.getVorname());
        output.append(", ");
        output.append(freund.getNachname());
        System.out.println(output.toString());
    }
}

Das wären so die Punkte, die ich einmal anmerken und etwas beschreiben wollte.
 

Miez

Mitglied
Wow, vielen Dank! Ich hatte Grundkurs Programmieren in Java von Dietmar Ratz und weiteren Autoren als Buch zum Kurs gelesen.
Ihre Erklärung leuchtet mir ein.
Ich werde mich nochmal gründlich in das andere Buch einlesen :)
 

Miez

Mitglied
Hallo, hier bin ich nochmal mit einer Frage :)

Ich hab mit Ihren Erklärung alles gut hinbekommen, das Programm schnurrt :)
Jetzt bin ich noch am Feinschliff....

Ich hab mich gefragt, ob ich wenn ich meine Freundesliste ausgebe, auch eine Ausgabe machen kann wie "Du bist allein", sollten sich aktuell keine Freunde-Objekte in der Liste befinden....

Ich hab hiermit experimentiert, aber das war wenig fruchtbar.....


Java:
case 6:
                    JOptionPane.showMessageDialog(null, "Freundesliste:" + ak.getFreunde());
                    boolean ergebnisZwei = ak.getFreunde();
                    if (!ergebnisZwei) {
                        JOptionPane.showMessageDialog(null, "Du bist allein!");
                    }
                    break;

das gibt Fehler.

Zur Erklärung: wenn ich nur die Freundesliste ausgebe, dannn bekomme ich die mit getFreunde ohne Probleme. Aber wie stelle ich das an, dass bei einer leeren Liste eine String Message ausgegeben wird?

Vielen Dank!
 

KonradN

Super-Moderator
Mitarbeiter
Hier wäre mein genereller Tipp: Überlege Dir den genauen Ablauf und schreibe diesen in Worten auf. Und dann setze es erst um.

Hintergrund ist, dass die Logik schon unsinnig ist. Unabhängig davon, dass der Code nicht übersetzt: Du willst doch nicht erst den MessageDialog haben: "Freundesliste: " um dann da nach noch eine weitere Mitteilung "Du bist allein!" zu bekommen.

Daher: Schreibe GENAU auf, was Du machen willst. Das könnte also sein:
Wenn Anzahl Freunde == 0
dann: Nachricht: "Du bist alleine"
sonst: Nachricht: "Freundesliste: " gefolgt von Liste aller Freunde.

Und das kannst Du dann umsetzen. Du musst also schauen, dass Du eine Methode hast, um die Anzahl der Freunde anzufragen. Evtl. hast Du das schon oder Du musst sowas dann noch einbauen ...

Zu dem Code:
a) Nutz bitte Variablen, die etwas aussagen! ak oder ergebnisZwei sagen nichts aus!
b) getFreunde() wird vermutlich einen String zurück geben. (Oder auch gerne eine Liste mit Freunden oder so). Das kannst Du nicht in ein boolean speichern. Das dürfte vermutlich der Fehler sein, von dem Du sprichst. (Hier wäre es in Zukunft hilfreich, wenn Du uns auch den genauen Fehler mitteilen würdest)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Ausgabe einer ArrayList auf einem Label Java Basics - Anfänger-Themen 4
N Ausgabe des Inhalts eines String Arrays in einer ArrayList Java Basics - Anfänger-Themen 4
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
G Problem bei der Ausgabe einer Main Claase Java Basics - Anfänger-Themen 7
T Ausgabe einer for Schleife Java Basics - Anfänger-Themen 2
M Ausgabe einer Liste welche mehrere Stacks enthält Java Basics - Anfänger-Themen 3
M Ausgabe einer kleinen Aufgabe Java Basics - Anfänger-Themen 2
TomatenBrot447 Mit toString eine Ausgabe liefern wie in einer schon implementierten Methode ? Java Basics - Anfänger-Themen 13
TomatenBrot447 Mit toString eine Ausgabe liefern wie in einer schon implementierten Methode ? Java Basics - Anfänger-Themen 1
D Ausgabe einer Matrix mit System.out.println Java Basics - Anfänger-Themen 6
S Programm zum Einlesen einer Zahl und Ausgabe der Wurzel Java Basics - Anfänger-Themen 13
A Ausgabe einer Division Java Basics - Anfänger-Themen 11
Dogge URL-Ausgabe/Verarbeitungsproblem mittels einer Applikation Java Basics - Anfänger-Themen 2
D Prüfung zur korrekten Ausgabe einer Methode Java Basics - Anfänger-Themen 2
M Ausgabe einer gerade Zahl nur mit Addition,subtraktion und vergleichsoperatoren! Java Basics - Anfänger-Themen 4
C Programm zur Ausgabe einer ausgewählten Methode Java Basics - Anfänger-Themen 2
H Ausgabe in einer Zeile Java Basics - Anfänger-Themen 4
JeromeM90 Problem bei einer Ausgabe von einem bestimmten Zeichen Java Basics - Anfänger-Themen 5
A Ausgabe einer variablen im textfeld Java Basics - Anfänger-Themen 3
R JSP: Ausgabe einer entfernten Webseite in Variable einlesen Java Basics - Anfänger-Themen 2
K Ausgabe problem in einer Hausaufgabe Java Basics - Anfänger-Themen 5
H Hilfe bei Ausgabe in einer Datei. Java Basics - Anfänger-Themen 5
C Ausgabe in Dos-Konsole, die von einer GUI gestartet wird. Java Basics - Anfänger-Themen 2
I VisualClass: Ausgabe einer Variable Java Basics - Anfänger-Themen 2
A Problem mit Ausgabe einer Liste über einen Client Java Basics - Anfänger-Themen 5
X Arrays - Erstellen einer Klasse zur Ausgabe von Reihen etc. Java Basics - Anfänger-Themen 12
ven000m Rautenstern mit nur einer System.xx Ausgabe! Java Basics - Anfänger-Themen 21
B Ausgabe in bestimmte Zeile einer html Datei Java Basics - Anfänger-Themen 12
D rekursive ausgabe einer zahl Java Basics - Anfänger-Themen 14
P Berechnen des Klassendurchschnitts und Ausgabe einer Kurve Java Basics - Anfänger-Themen 3
C Ausgabe in einer Datei Java Basics - Anfänger-Themen 2
N geschachtelte ausgabe einer zeichenkette Java Basics - Anfänger-Themen 5
M Methode zielnah zeigt das gewünschte Ausgabe nicht an Java Basics - Anfänger-Themen 3
M Ausgabe beim Overloading Java Basics - Anfänger-Themen 3
H Frage zur Ausgabe Java Basics - Anfänger-Themen 4
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
S Einfach-Verkettete-Listen Ausgabe zeigt nur 1. und letzte instanz Java Basics - Anfänger-Themen 2
T float soll durch schleife die größte mögliche Zahl herausfinden, Ausgabe ist aber "Infinity" Java Basics - Anfänger-Themen 1
B Binärzahlen auflisten, falsche Ausgabe? Java Basics - Anfänger-Themen 1
M Java Ausgabe der höchsten Zahl Java Basics - Anfänger-Themen 14
M Erste Schritte While Schleife / Ausgabe von buchstabe & ASCII Wert Java Basics - Anfänger-Themen 4
W Streams in Java und was bedeutet meine Konsolen-Ausgabe? Java Basics - Anfänger-Themen 4
B Automatisierte Ausgabe (Schleife, If-Abfrage?) Java Basics - Anfänger-Themen 24
C 2D Array Ausgabe mit for-Schleife i,j Java Basics - Anfänger-Themen 4
B Deadlock verstehen der Ausgabe! Java Basics - Anfänger-Themen 12
Lion.King Ausgabe mit Eigenschaften Java Basics - Anfänger-Themen 4
D Java Pattern mit X Ausgabe Stern Java Basics - Anfänger-Themen 4
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 0
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 5
Xaver code Tastatur ausgabe Java Basics - Anfänger-Themen 4
R Anfänger: Ausgabe kommt minus raus? Java Basics - Anfänger-Themen 6
K Leerzeile in Konsolen-Ausgabe Java Basics - Anfänger-Themen 4
K Zweite Ausgabe von vererbten Klassen Java Basics - Anfänger-Themen 3
Q return Ausgabe Java Basics - Anfänger-Themen 4
C Java Arrays - Ausgabe in Methode Java Basics - Anfänger-Themen 12
D Best Practice Ausgabe über direkte Ausgabe oder try-catch? Java Basics - Anfänger-Themen 13
S Ausgabe des Variablenwerts Java Basics - Anfänger-Themen 10
I Ausgabe nicht nur senkrecht sondern auch waagerecht. Java Basics - Anfänger-Themen 2
paulen1 Methoden Unerwünschte Ausgabe bei System.out.print in For-Schleife Java Basics - Anfänger-Themen 8
C Ausgabe boolean return ((n==9)||(n==0)); Java Basics - Anfänger-Themen 13
F Double Ausgabe nicht wissenschaftlich Java Basics - Anfänger-Themen 16
danieldemetry Java - Graph Komponenten - Ausgabe Java Basics - Anfänger-Themen 0
S Fragen zu Ausgabe double und float Java Basics - Anfänger-Themen 3
B Ausgabe in TextArea funktioniert nicht Java Basics - Anfänger-Themen 2
D BigDecimal Ausgabe sehr lang. Java Basics - Anfänger-Themen 2
J String Ausgabe Java Basics - Anfänger-Themen 2
TimoN11 IntelliJ , Ausgabe von einem Quellcode in Eingabe eines Quellcodes Java Basics - Anfänger-Themen 1
Kalibru Problem bei Ausgabe von Objekt Java Basics - Anfänger-Themen 1
KogoroMori21 Array-Ausgabe Java Basics - Anfänger-Themen 6
JaVaN0oB Wörterraten - Falsche Ausgabe, String/Chars vergleichen Java Basics - Anfänger-Themen 2
E Ausgabe überschreiben Java Basics - Anfänger-Themen 15
D Ausgabe von Array Java Basics - Anfänger-Themen 2
U Ausgabe Java Basics - Anfänger-Themen 4
J Buchstabenhäufigkeit mit Array und Ausgabe des häufigsten Buchstaben Java Basics - Anfänger-Themen 25
V Multiplikationstafel - Ausgabe Java Basics - Anfänger-Themen 4
L Warum ist die Ausgabe anders als das was im Bezeichner steht? Java Basics - Anfänger-Themen 4
M In gleicher zeile hinter ausgabe noch etwas ausgeben Java Basics - Anfänger-Themen 1
newcomerJava Nach doppelter Zahl eine Ausgabe Java Basics - Anfänger-Themen 10
H Falsche Ausgabe Java Basics - Anfänger-Themen 2
P Klassenübergreifende Ausgabe mittels "getter" nicht möglich Java Basics - Anfänger-Themen 21
R Call-by-Value, Call-by-Reference, Call-by-Name Ausgabe Java Basics - Anfänger-Themen 1
JavaClap "Bruchrechner" liefert Fehler/keine Ausgabe bei Addition und Subtraktion Java Basics - Anfänger-Themen 0
D Warum erfolgt folgende Ausgabe und warum? Java Basics - Anfänger-Themen 4
C Ausgabe in der Konsole Java Basics - Anfänger-Themen 11
M Problem bei Ausgabe Java Basics - Anfänger-Themen 7
C Konvertierung des int typs in den double typ für die Ausgabe mit Nachkommastellen Java Basics - Anfänger-Themen 4
A Ausgabe mit boolean Java Basics - Anfänger-Themen 3
K Probleme bei der Ausgabe - komme nicht weiter :/ Java Basics - Anfänger-Themen 15
Y Methode + Parameters + Ein und Ausgabe Java Basics - Anfänger-Themen 1
K Methodenaufruf /-ausgabe Java Basics - Anfänger-Themen 5
A Wiederholte Ausgabe vermeiden Java Basics - Anfänger-Themen 16
B Collections Objektreferenz-ID in der Ausgabe (Comparator Interface) Java Basics - Anfänger-Themen 2
M Wie analysiert JSON eine toString-Ausgabe ? Java Basics - Anfänger-Themen 1
T Vererbung Verschiedene Fahrzeugtypen mit unterschiedlicher Ausgabe Java Basics - Anfänger-Themen 17
S Elemente eines Arrays bei Ausgabe auslassen Java Basics - Anfänger-Themen 2
T Text-Ausgabe für Textadventure - Organisation Java Basics - Anfänger-Themen 5
G Unterklassen (Klasse für Ausgabe) Java Basics - Anfänger-Themen 4
N Eingabe des Users direkt hinter die Ausgabe Java Basics - Anfänger-Themen 3
J Methode zur Ausgabe eines Dreiecks aus Sternen schreiben? Java Basics - Anfänger-Themen 2
ZH1896ZH Wieso diese Ausgabe?? Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben