Attribut durch Methode einer Liste hinzufügen

rei0d

Mitglied
Hallo!
Wir sollen ein Programm mit Java programmieren, das Tiere aus einer vorher generierten Textdatei einliest, in unterschiedliche Listen sortiert und dann wieder ausgibt. Außerdem soll noch eine Methode geschrieben werden, die Tiere aus einer Liste "streichelt". Soweit zum Grundaufbau. Einer Liste von Tieren ("Haustiere") sollen noch ein Name je Tier hinzugefügt werden, da liegt auch mein Problem. Einlesen, Sortieren und Ausgabe der Listen klappt auch soweit.

Durch eine Switch-Anweisung soll jedes Tier einer bzw. zwei Listen zugeordnet werden. Eigentlich müsste es doch mit folgendem Quellcode gehen:
Java:
case "Maine-Coon":
				 fe = new MaineCoon(getName(reader1));
				 felist.add(fe);
				 tilist.add((MaineCoon) fe);
				 break;
Es soll, immer wenn "Maine-Coon" gefunden wurde, dies mit der Methode getName zwei Listen zugeordnet werden.

Es kommt aber folgende Fehlermeldung:
[WR]"Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method getName(ArrayList<String>) in the type ZooTiereMain is not applicable for the arguments (Scanner)"[/WR]

Hier meine getName Methode (Sie soll aus einer Textdatei mit Namen den Tieren der Liste <Haustiere> zufällig einen zuteilen):
Java:
	public static String getName(ArrayList<String> Namen) {
		int ran = (int) (Math.random() * Namen.size());
		return Namen.get(ran);
	}

Die MaineCoon.java Datei:
Java:
package zoo;

public class MaineCoon extends Feloidea implements Haustiere {
	String name;

	public String toString() {

		return "Art: Maine-Coon, " + "Familienzugehörigkeit: Feloidea, "
				+ "Identifikationsnummer: " + nummer + ", Futter: " + futter
				+ ", Name: " + getName;

	}

	public MaineCoon(String na) {
		super();
		name = na;
		futter = "Katzenfutter";

	}

	public String streicheln() {
		String str = "Miauz";
		return str;
	}
}
Hier der ganze Quellcode meiner ZooTiereMain Datei.

Java:
package zoo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Scanner;

public class ZooTiereMain {

	public static void main(String[] args) throws FileNotFoundException {
		System.out.println("Willkommen im Zoo!");
		File dirnamen = new File(".\\Daten\\Namen.txt");
		InputStream namenstream = new FileInputStream(dirnamen);
		Scanner reader1 = new Scanner(namenstream);
		ArrayList<String> nalist = new ArrayList<String>();
		while (reader1.hasNext()) {
			nalist.add(reader1.nextLine());
		}
		File dirtiere = new File(".\\Daten\\Tiere.txt");
		InputStream istream = null;
		istream = new FileInputStream(dirtiere);
		String line;
		ArrayList<Feloidea> felist = new ArrayList<Feloidea>();
		ArrayList<Canoidea> calist = new ArrayList<Canoidea>();
		ArrayList<Haustiere> tilist = new ArrayList<Haustiere>();

		if (dirtiere != null) {
			istream = new FileInputStream(dirtiere);
			Scanner reader = new Scanner(istream,"ISO8859_1");
			Feloidea fe;
			Canoidea ca;
			Haustiere ha;
			while (reader.hasNext()) {
				line = reader.nextLine();
				switch (line) {
				case "Erdmännchen":
					fe = new Erdmaennchen();
					felist.add(fe);
					break;
				case "Amurtiger":
					fe = new Amurtiger();
					felist.add(fe);
					break;
				 case "Maine-Coon":
				 fe = new MaineCoon(getName(reader1));
				 felist.add(fe);
				 tilist.add((MaineCoon) fe);
				 break;
				case "Türkisch Van":
					fe = new TuerkischVan();
					felist.add(fe);
					tilist.add((TuerkischVan) fe);
					break;
				case "Wolf":
					ca = new Wolf();
					calist.add(ca);
					break;
				case "Kodiakbär":
					ca = new Kodiakbaer();
					calist.add(ca);
					break;
				case "Beagle":
					ca = new Beagle();
					calist.add(ca);
					tilist.add((Haustiere) ca);
					break;
				case "Bernhardiner":
					ca = new Beagle();
					calist.add(ca);
					tilist.add((Haustiere) ca);
					break;
				}
			}
			System.out.println(felist);
			System.out.println(calist);
			System.out.println(tilist);
			System.out.println(nalist);
		}

	}

	public static String getName(ArrayList<String> Namen) {
		int ran = (int) (Math.random() * Namen.size());
		return Namen.get(ran);
	}
}

//edit1: Anscheinend kann ich die JAVA Files nicht spoilern. :/
//edit2: Exception hinzugefügt.
 
Zuletzt bearbeitet:

Bernd Hohmann

Top Contributor
Durch eine Switch-Anweisung soll jedes Tier einer bzw. zwei Listen zugeordnet werden. Eigentlich müsste es doch mit folgendem Quellcode gehen:
Java:
case "Maine-Coon":

Mit Sicherheit nicht, weil switch/case nicht mit Strings umgehen kann.

Traditionell würde ich mir erstmal paar Konstanten (kann man bestimmt auch über "enum" schöner machen) definieren:

public final static int ANIMAL_ERDMAENNCHEN=1;
public final static int ANIMAL_AMURTIGER=2;
public final static int ANIMAL_MAINE_COON=3;
...

public final static int SPECIES_FELOIDEA = 1;
...

Dann eine Klasse "Animal" (gar nicht gross mit Vererbung und Interfaces dengeln) wo diese Konstanten eingespeist werden. Dazu noch Futter etc..

Vielleicht bringt Dich mein Ansatz auf andere Gedanken.

Bernd
 

rei0d

Mitglied
@Bernd Hohmann,
danke für die schnelle Antwort, jedoch müssen wir das ganze mit Vererbung und Interfaces regeln, das ist von unserem Prof so vorgegeben, auch wenn es bessere Möglichkeiten gibt.
Das einzige was bei mir nicht funktioniert ist, dass er bei der switch-Anweisung bestimmten Tieren einen Namen(nicht der Name der Art, sondern z.B. Jens) hinzufügen soll.
 
N

nillehammer

Gast
Seit Java 7 kann man auch auf Strings switchen.

Der Fehler steckt in folgendem Codestück:
[JAVA=46]
case "Maine-Coon":
fe = new MaineCoon(getName(reader1));
[/code]
Dort übergibst Du mit der Variable
Code:
reader1
einen Scanner, wo Du eigentlich eine
Code:
ArrayList<String>
übergeben müsstest.
 

rei0d

Mitglied
Der Fehler steckt in folgendem Codestück:
[JAVA=46]
case "Maine-Coon":
fe = new MaineCoon(getName(reader1));
[/code]
Dort übergibst Du mit der Variable
Code:
reader1
einen Scanner, wo Du eigentlich eine
Code:
ArrayList<String>
übergeben müsstest.

Danke, hab das entsprechend geändert, jetzt sieht es so aus:
Java:
case "Maine-Coon":
					fe = new MaineCoon(getName(nalist));
					felist.add(fe);
					tilist.add((MaineCoon) fe);
					break;
..und funktioniert auch ohne Fehlermeldung.

Jetzt muss ich es nur noch hinkriegen, dass den Tieren aus der <Haustiere> Liste ein zufälliger, in einer Textdatei abgespeicherter, Name zugeordnet wird.

Meine getName sieht derzeit so aus:

Java:
public static String getName(ArrayList<String> Namen) {
		int ran = (int) (Math.random() * Namen.size());
		return Namen.get(ran);
	}
Damit wird aber nicht nur ein Name vergeben, sondern alle. Wisst ihr eine bessere Möglichkeit?
 
N

nillehammer

Gast
Meine getName sieht derzeit so aus:

Java:
 public static String getName(ArrayList<String> Namen) {
        int ran = (int) (Math.random() * Namen.size());
        return Namen.get(ran);
    }
Damit wird aber nicht nur ein Name vergeben, sondern alle. Wisst ihr eine bessere Möglichkeit?
Weiß jetzt nicht, was Du mit "nicht nur ein Name vergeben, sondern alle" meinst. Habe es auch nicht nachgeprüft. Aber der Code sieht so aus, als ob er einen zufällig ausgewählten String zurückgibt. Was stört Dich denn? Dass Namen evtl. doppelt vergeben werden?
 

rei0d

Mitglied
Im Moment sieht die Ausgabe so aus:
Aaron Abba Abby Abigail Abracadabra Abraxas Achat Achill Achilles Achim Achmed Acky Ada Adam Addi Adele Adelheid Adi Adina Admiral Adonis Adrian Adriatic Afra Afram Aggy: Wau Wau!

Es sollte aber z.B. so aussehen:

Adrian: Wau Wau!

Es wurde also die ganze Liste als Name übergeben und nicht nur ein Element.

Ok, hab es hin bekommen, es lag nicht an der Programmierung sondern an der Textdatei, die Namen waren alle auf einer Zeile und nicht ein Name pro Zeile. Jetzt funktioniert es einwandfrei!
 

Oben