# Attribut durch Methode einer Liste hinzufügen



## rei0d (13. Dez 2012)

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:

```
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):

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

Die MaineCoon.java Datei:

```
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.



Spoiler





```
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.


----------



## Bernd Hohmann (13. Dez 2012)

rei0d hat gesagt.:


> Durch eine Switch-Anweisung soll jedes Tier einer bzw. zwei Listen zugeordnet werden. Eigentlich müsste es doch mit folgendem Quellcode gehen:
> 
> 
> 
> ...



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 (13. Dez 2012)

@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.


----------



## nillehammer (13. Dez 2012)

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 
	
	
	
	





```
reader1
```
 einen Scanner, wo Du eigentlich eine 
	
	
	
	





```
ArrayList<String>
```
 übergeben müsstest.


----------



## Bernd Hohmann (13. Dez 2012)

nillehammer hat gesagt.:


> Seit Java 7 kann man auch auf Strings switchen.



Wow - leider kommt dieses Feature 15 Jahre zu spät :-(

Bernd


----------



## rei0d (14. Dez 2012)

nillehammer hat gesagt.:


> Der Fehler steckt in folgendem Codestück:
> [JAVA=46]
> case "Maine-Coon":
> fe = new MaineCoon(getName(reader1));
> ...



Danke, hab das entsprechend geändert, jetzt sieht es so aus:

```
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:


```
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?


----------



## nillehammer (14. Dez 2012)

> Meine getName sieht derzeit so aus:
> 
> 
> ```
> ...


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 (14. Dez 2012)

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!


----------

