Methoden Alle Objekte der ArrayList ausgeben funktioniert nicht.

  • Themenstarter Themenstarter .getHilfe()
  • Beginndatum Beginndatum
G

.getHilfe()

Gast
Ich habe die Aufgabe, eine vorher zu befüllende Arrayliste auszugeben.
Die Objekt-Klasse mit der ich das Array befülle lautet
Java:
public class Land {
	
	private String name;
	private String hauptstadt;
	private int einwohnerzahl;
	private int flaecheInQKM;

	public Land(String name, String hauptstadt, int einwohnerzahl,
			int flaecheInQKM) {
		this.name = name;
		this.hauptstadt = hauptstadt;
		this.einwohnerzahl = einwohnerzahl;
		this.flaecheInQKM = flaecheInQKM;
public void ausgabe() {
		System.out.println(name + "," + hauptstadt + ","
				+ einwohnerzahl + "," + flaecheInQKM);

Ich habe eine Testklasse erstellt, und dass ausgeben von spezifischen Ländern funktioniert so, wie ich es mir vorgestellt habe.

Jetzt wird in LandVerwaltung eine Methode liesDaten erstellt,
Java:
ArrayList<Land> laender = new ArrayList<Land>();
public void liesDaten(ArrayList<Land> liste, String dateiname) {
		try {
			BufferedReader in = new BufferedReader(new FileReader(dateiname));
			String zeile = null;
			while ((zeile = in.readLine()) != null) {
				String[] temp = zeile.split(";");
				int w = Integer.parseInt(temp[2]);
				int e = Integer.parseInt(temp[3]);

				//Hier bin ich etwas unsicher, ob die benennung "x" später eine Rolle spielt
				Land x = new Land(temp[0], temp[1], w, e);
				laender.add(x);
				
				//x.ausgabe();  
                               //Ich erhalte alle Länder, sobald ich die Methode ausgabe auf diese Art einbaue, dies entspricht aber nicht der Aufgabenstellung.

			}

		} catch (IOException e) {
			e.printStackTrace();
		}

	}
(welche ich ebenfalls erfolgreich getestet habe ) um ein Array in einer while-schleife mit Objekten des typs Land aus einer textdatei zu füllen.
Java:
public class Hausarbeit {
public static void main (String []args){
	Hausarbeit meineHausarbeit = new Hausarbeit ();
		
	
		
		
		meineHausarbeit.aufgabe2 ();
}
	

public void aufgabe2 (){
	ArrayList<Land> laender = new ArrayList<Land>();
	String dateiname = "(korrekter dateipfad)" ;
	LandVerwaltung meineLandVerwaltung = new LandVerwaltung ();
	meineLandVerwaltung.liesDaten(laender, dateiname);
	meineLandVerwaltung.selectionSort(laender);

//und hier kommt das Problem! Ich würde gerne die nun sortierte Liste wieder in der Konsole ausgeben, ich habe es auch schon mit for-each probiert. Irgendwie erscheint aber nichts in der Konsole, benutze ich die liste.get(int) methode falsch?
	for(int g = 0; g < laender.size(); g++){
    laender.get(g).ausgabe();}

 
    }
}

Am Ende erhalte ich keine Ausgabe in der konsole, obwohl ich eigentlich dachte, dass ich über die for-schleife und den get() befehl an alle einträge der Liste herankomme. Bin ratlos. Dies ist die letzte Aufgabe die mir zur Fertigstellung meiner Hausarbeit fehlt, also wäre ich für Hilfe sehr dankbar.
 
Die Liste, die du am Ende ausgibst, ist leer.
In der Methode liesDaten füllst du eine Liste, aber nicht die, die du in der Methode aufgabe2 angelegt hast und später ausgeben willst..
 
Deine liesDaten-Methoden muss die ArrayList zurückgeben.
Java:
public ArrayList<Land> liesDaten(ArrayList<Land> liste, String dateiname) {
   .
   .
   .
   return laender;
}

Und in deiner Aufgabe 2 speicherst du den Wert einfach wie folgt:
Java:
laender = meineLandVerwaltung.liesDaten(laender, dateiname);
 
frage : warum parameter List<?> "liste" wenn diese überhaupt nicht verwendet wird ?
lösung : raus damit ...
 
Danke für die Hilfe, mein Problem wäre gelöst, allerdings hat sich jetzt ein Folgeproblem aufgetan 🙁, welches ich vorher nicht erkannt habe.
Ich soll die Liste zuert unsortiert, dann sortiert ausgeben. Jedoch habe ich anscheinend eine endlosschleife oder sowas in meiner sortiermethode, denn das programm hört nicht auf zu arbeiten, gibt aber nie eine zweite liste aus 🙁 .

Wenn noch jemand einen Anstoss für mich hat, oder sieht dass ich totalen Mist gebaut hab, schreibt mir das bitte 😛

Also ich poste hier jetzt die überarbeitete Aufgabe 2 , dann die sortiermethode.
(Liegt der fehler darin, dass die sortiermethode ohne return anweisung ist ? falls ja hab ich ein problem, denn das Diagramm, welches ich benutzen muss gibt mir void in diesem falle vor )
Java:
public void aufgabe2 (){
	ArrayList<Land> laender = new ArrayList<Land>();
	String dateiname = "C://Users//Dennis B//Eclipse//Land.txt" ;
	LandVerwaltung meineLandVerwaltung = new LandVerwaltung ();
	laender = meineLandVerwaltung.liesDaten( dateiname);
	for(int g = 0; g < laender.size(); g++){
	    laender.get(g).ausgabe();}
	meineLandVerwaltung.selectionSort(laender);
	for(int g = 0; g < laender.size(); g++){
    laender.get(g).ausgabe();}
und hier jetzt vergleiche (aus der klasse land) ,tausche (aus landverwaltung) und sortiere(auch in landverwaltung) :
Java:
public boolean vergleiche(Land vergleichsLand) {
		if (getName().compareTo(vergleichsLand.getName()) > 0) {
			return false;
		} else {
			return true;
		}
Java:
public void tausche(int a, int b, ArrayList<Land> laender) {
		Land tmp = laender.get(a);
		laender.set(a , laender.get(b));
		laender.set(b , tmp);

	}

	public void selectionSort(ArrayList<Land> laender) {
		int n = laender.size();
		int links = 0;
		while (links < n) {
			int min = links;
			for (int i = links + 1; i < n; i++) {
				laender.get(min).vergleiche(laender.get(i));
				if (true) {
					min = i;
				}
				tausche(min, links, laender);
				links = links + 1;

			}

		}
	}

danke nochmal für die bisherige hilfe, alleine wäre ich da nicht drauf gekommen !
 
Das Problem wird vermutlich da liegen, denn dein if wird immer ausgeführt, da du das Ergebnis aus
Java:
laender.get(min).vergleiche(laender.get(i));
nicht zuweist.

Java:
	...
				laender.get(min).vergleiche(laender.get(i));
				if (true) {
					min = i;
				}
				tausche(min, links, laender);
				links = links + 1;

			}

		}
	}

danke nochmal für die bisherige hilfe, alleine wäre ich da nicht drauf gekommen !
 
Da bin ich gerade sehr unsicher :/
Java:
for (int i = links + 1; i < n; i++) {
				if (laender.get(min).vergleiche(laender.get(i)) == true) {
					min = i;
				}
				tausche(min, links, laender);
				links = links + 1;

			}
wäre es in Ordnung das so zu machen ?
Das würde aber dem Diagramm das mir vorliegt widersprechen, und ein Ergebniss erhalte ich da auch nicht 🙁

Ich bin aber auch gerade furchtbrar blind irgendwie, ich hab da Stundenlang dran gebastelt an der Hausarbeit, und vielleicht kennt ihr das , aber wenn man sich das selbstgeschriebene durchliest, sieht man einfach die Fehler nicht , selbst wenn man es Wort für Wort abarbeitet :/
 
Klar kann man das machen 🙂 Geht auch so
Java:
if (laender.get(min).vergleiche(laender.get(i)))...
Wieso widerspricht das den Vorgaben?

Nutzt du eine IDE? Dann könntest du dir z. B. auch die einzelnen Schritte im Debugger ansehen und kucken, was passiert und so den Fehler finden.
 
Ne widerspricht es gar nicht, ich hab da nur was falsch verstanden.
Ok, soweit so gut.
Nurleider hört das programm immernoch nicht auf zu arbeiten und gibt keine 2. Liste aus :_( .
Ich benutze eclipse, aber keine ahnung wie der debugger funktioniert, ich bin da absoluter anfänger, hab den noch nie benutzt.
Ich lass es mal ein paar minuten arbeiten, vielleicht ist die suchmethode irgendwie aufwändig und es braucht deswegen länger xD .
Ich bin ratlos, mich ärgert vor allem,dass ich endlich fertig wär, aber bei dem problem einfach nicht die Lösung finde.
 
Wenn du magst, kannst du ja die Klassen mal als ZIP anhängen, dann lässt sich einfacher drüberschaun als hier im Thread. Dann könnte ich dir noch einen Tipp geben.
 
Zuletzt bearbeitet:
habe es nur überflogen, aber ich denke das
Java:
	public void selectionSort(ArrayList<Land> laender) {
		int n = laender.size();
		int links = 0;
		while (links < n) {
			int min = links;
			for (int i = links + 1; i < n; i++) {
				laender.get(min).vergleiche(laender.get(i));
				if (true) {
					min = i;
				}
				tausche(min, links, laender);
				links = links + 1;

			}

		}
	}

müsste so ausehen:
Java:
    public void selectionSort(ArrayList<Land> laender) {
        int n = laender.size();
        int links = 0;
        while (links < n) {
            int min = links;
            for (int i = links + 1; i < n; i++) {
                laender.get(min).vergleiche(laender.get(i));
                if (true) {
                    min = i;
                }
                tausche(min, links, laender);
            }
            links = links + 1;//bzw. besser links++;
       }
    }
 
Danke Danke , jetzt gibt eclipse ne zweite liste aus !
Ich bin zwar etwas verwirrt, warum diese so aussieht wie sie es tut, aber vielleicht verstehe ich einfach compareTo() falsch.
Ich denke ab hier kann ich die letzten Feinheiten selbst erledigen, danke nochmal !
 

Zurück
Oben