# Kurze Frage zu Array



## yuro (15. Dezember 2011)

Servus,

und zwar hab ich ne folgende Frage.. Mein Programm soll alle ISBN Nummern anzeigen.

die variable "isbn" wurde in der Java Klasse CD definiert.

"cds" kommt von ArrayList<CD> cds = new ArrayList<CD>();


```
Manager.java:

	//Zeige alle ISBN
	public String[] holeAlleISBN() throws RemoteException {
		String[] tmp = null;
		
		for(int i=0; i < cds.size(); i++){
			CD tmpCD = cds.get(i);
			
			if(!tmp.contains(tmpCD.isbn)){
				tmp.add(tmpCD.isbn);
			}
		}
		return tmp;		
	}
```

er kann die if-schleife ned aufrufen...?! was müsst ich denn da genau ändern? Kann mir jmd helfen?!

gruß


----------



## sheel (15. Dezember 2011)

Hi

Mit "nicht aufrufen" meinst du Compilerfehler?
Warum denkst du denn, dass ein Array contains und add kann?
Vor allem, wenn es null ist?

Und if ist keine Schleife. Schleifen wiederholen sich (while, do-while, for, foreach).

Gruß


----------



## yuro (15. Dezember 2011)

Ja das wird mir angezeigt:

Cannot invoke contains(String) on the array type String[]

if anweisung sorry.. 

ja wenn ich doch String[] tmp = new String[] <-- muss ich doch was einfügen in die Klammern oder nicht****

Ich dachte erstmal das es geht wie beim ArrayList<> aber dann hat mich das gegenteil überzeugt


----------



## sheel (15. Dezember 2011)

Nein, geht nicht wie bei der ArrayList.

Das pure Array kann nicht vergrößert werden,
das muss bei new schon seine fixe Größe bekommen.
Die Größe hast du ja mit cds.size() schon.


----------



## yuro (15. Dezember 2011)

ok das heisst ich kann String[] tmp = null; belassen? und muss die If-Anweisung entfernen****

Aber er überschreibt doch dann die ganze zeit das letzte.. wie  lass ich dann ALLE anzeigen und ned immer das aktuellste**** oder hab ich das gerade falsch verstanden?


----------



## sheel (15. Dezember 2011)

Ja, falsch verstanden.

```
public String[] holeAlleISBN() throws RemoteException {
	String[] tmp = new String[cds.size()];

	for(int i=0; i < cds.size(); i++)
		tmp[i] = cds.get(i).isbn;
	return tmp;     
}
```

Gruß


----------



## yuro (15. Dezember 2011)

Dankeee für die Hilfe echt.

Ich hab noch ne Frage was ist mit der Klasse CD.. bei mir steht

"Type mismatch: cannot convert from CD to String"

von der Zeile 
	
	
	



```
tmp[i] = cds.get(i);
```


----------



## sheel (15. Dezember 2011)

Mein Fehler, ist im Code oben ausgebessert (".isbn").


----------



## yuro (15. Dezember 2011)

aaah ok... und wenn ich jetzt sagen wir mal als beispiel:


```
public CD[] holeCDProKategorie(String kategorie) throws RemoteException { }
```

hätte.. da könnte ich ja das obere auch übernehmen nur halt für kategorie und müsste einen verweis auf das String kategorie machen oder****


----------



## sheel (15. Dezember 2011)

Ist kategorie ein String in CD?


----------



## yuro (15. Dezember 2011)

Jap habs in der Datei CD.java  als


```
public String kategorie;
```

definiert.


----------



## sheel (15. Dezember 2011)

```
public String[] holeCDproKategorie(String kategorie) throws RemoteException {
	int i, j = 0;
	for(i = 0; i < cds.size(); i++) {
		if(cds.get(i).kategorie.equals(kategorie))
			j++;
	}
	String[] tmp = new String[j];
	j = 0;
	for(i = 0; i < tmp.length; i++) {
		if(cds.get(i).kategorie.equals(kategorie))
			tmp[j++] = cds.get(i).isbn;
	}
	return tmp;     
}
```


----------



## yuro (15. Dezember 2011)

Also er geht die for-schleife durch und vergleicht mit equals den string kategorie.. und erhöht j auf eins bis er alle durch hat und erstellt dann ein neuen String..****


----------



## sheel (15. Dezember 2011)

Es wird einmal alles durchgegangen, um herauszufinden,
wieviel CDs in die Kategorie passen.

Dann wird ein entsprechend großes Stringaray erstellt.

In der zweiten for-Schleife wird dieses dann auch gefüllt.


----------



## yuro (15. Dezember 2011)

ich hab mal das geändert aber dann ist das return tmp; falsch... aber ich muss ja das Array CD[] für String[] ersetzen ne****(da ja public CD[] holeCD..etc.  Nur dann passt die zeile wieder nicht:


```
tmp[j++] = cds.get(i).isbn;
```

cannot convert from String to CD


----------



## sheel (15. Dezember 2011)

Wenn du die ganzen CDs zurückgeben willst:

```
public CD[] holeCDproKategorie(String kategorie) throws RemoteException {
	int i, j = 0;
	for(i = 0; i < cds.size(); i++) {
		if(cds.get(i).kategorie.equals(kategorie))
			j++;
	}
	CD[] tmp = new String[j];
	j = 0;
	for(i = 0; i < tmp.length; i++) {
		if(cds.get(i).kategorie.equals(kategorie))
			tmp[j++] = cds.get(i);
	}
	return tmp;     
}
```
Ist aber wirklich nicht schwer, Stirng[] in CD[] zu ändern und das isbn wegzunehmen...


----------



## yuro (16. Dezember 2011)

sorrryyy war bisschen durcheinander gerade 

Dasselbe könnt ich jetzt auch als Beispiel so machen oder:


```
public CD holeCD(String isbn) throws RemoteException {

		    int i, j = 0;
		    
		    for(i = 0; i < cds.size(); i++) {
		        if(cds.get(i).isbn.equals(isbn))
		            j++;
		    }
		    
		    CD tmp = new CD(j);
		    j = 0;
		    
		    for(i = 0; i < tmp.length; i++) {
		        if(cds.get(i).isbn.equals(isbn))
		            tmp[j++] = cds.get(i);
		    }
		    return tmp;     
	}
```

Das wäre doch machbar oder?


----------



## sheel (16. Dezember 2011)

Da es jetzt um eine einzelne CD geht, nein.

```
public CD holeCD(String isbn) throws RemoteException {
	int i;
	for(i = 0; i < cds.size(); i++) {
		if(cds.get(i).isbn.equals(isbn))
			return cds.get(i);
	} 
}
```
Hat diese RemoteException eigentlich irgendeinen Sinn?


----------



## yuro (16. Dezember 2011)

Ja da es ja um RMI Server+Client geht.. da muss die ja dabei sein so wie ich das rauslesen konnte aus dem buch. 


muss ich da nicht was definieren wie CD tmp = new CD(); ****? bzw das ich am ende was return-en kann. da ich ja nach der for-schleife noch ein return setzen muss.


----------



## sheel (16. Dezember 2011)

```
public CD holeCD(String isbn) throws RemoteException {
	int i;
	for(i = 0; i < cds.size(); i++) {
		if(cds.get(i).isbn.equals(isbn))
			return cds.get(i);
	} 
	return null;
}
```
Und bin mit RMI ja nicht sehr vertraut,
aber wenn du unter keinen Umständen eine RemoteException in holeCD erzeugst,
kannst du das throws... meiner Meinung nach rausnehmen.


----------



## yuro (16. Dezember 2011)

Jetzt muss ich ja beim Client das ausgeben. und zwar hab ich das folgendermaßen gemacht bevor ich von dir die änderungen bekommen habe. Hab ja erstmal mit ArrayList das ganze gemacht wobei das dann ja falsch war, da ich das ja mit Arrays machen musste.. im Beispiel zu holeCDProKategorie -->CD[]

So in meiner Client.java hab ich folgendes definiert:


```
Client.java:

		if(wahl.equals("3")){
			System.out.println("Geben Sie eine Kategorie ein:");
			
			String katCD = scanner.next();
			
			ArrayList<CD> tmp = new ArrayList<CD>();
			
			System.out.println(tmp.size());

			tmp = service.holeCDProKategorie(katCD);
			
			System.out.println("titel\n isbn\n autor\n kategorie\n");

			for(int i=0; i < tmp.size(); i++){
				CD holeCdKat = tmp.get(i);
				System.out.print(holeCdKat.titel + "\t");
				System.out.print(holeCdKat.isbn + "\t");
				System.out.print(holeCdKat.autor + "\t");
				System.out.print(holeCdKat.kategorie + "\t");
				System.out.println();
			}
		}
```

Also der Benutzer hat die Chance eine Auswahl zu treffen.. wenn er die 3 eingibt wird der folgende Code oben ausgeführt.. aber ich müsste ja ArrayList<CD> ersetzen durch CD[] richtig?


edit:

Noch ne Frage zu meiner Initialisierung:


```
Manager.java:

	//CDManager initialisieren
	public void initialisiereCDManager() throws RemoteException {
		File txtDat = new File("cd.txt");
		
		Scanner scanner = null;
		
        try { 
        		scanner = new Scanner(txtDat);
        } catch (FileNotFoundException e){
			  System.out.println("Die Textdatei cd.txt wurde nicht gefunden.\n");
			  System.exit(0);
          }
          
        while(scanner.hasNext()){
        	String tmp = scanner.nextLine();
        	
        	String[] varAuswahl = tmp.split(";");
        	
        	CD tmpCD = new CD();
        	
        	tmpCD.autor = varAuswahl[0];
        	tmpCD.isbn = varAuswahl[1];
        	tmpCD.kategorie = varAuswahl[2];
        	tmpCD.titel = varAuswahl[3];
        	
        	cds.add(tmpCD);
        }
}
```

Wenn ich das Programm teste kommt immer die Exception raus.. Woran kann das liegen?


----------



## sheel (16. Dezember 2011)

```
Arraylist durch Array ersetzen: Ja, genau.
ArrayList<CD> -> CD[]
.size() -> .length
.get(i) -> [i]
```


Zur zweiten Frage: Welche Exc. kommt in welcher Zeile?


----------



## yuro (16. Dezember 2011)

> Zur zweiten Frage: Welche Exc. kommt in welcher Zeile?




```
//CDManager initialisieren
    public void initialisiereCDManager() throws RemoteException {
        File txtDat = new File("cd.txt");
        
        Scanner scanner = null;

        System.out.println(txtDat.getAbsolutePath());   //die hab ich neu hinzugefügt
	System.out.println(txtDat.exists());                    //das hier auch.
        
        try { 
                scanner = new Scanner(txtDat);
        } catch (FileNotFoundException e){
              System.out.println("Die Textdatei cd.txt wurde nicht gefunden.\n"); //die hier
              System.exit(0);
          }
```

Jetzt wenn ich den Server starte kommt folgende Ausgabe:



> E:\workspace\RMIRemoteServer\cd.txt
> false
> Die Textdatei cd.txt wurde nicht gefunden.


----------



## sheel (16. Dezember 2011)

Nun, dann gibts die Datei eben nicht.


----------



## yuro (16. Dezember 2011)

ja das ist ja das problem... ich hab die cd.txt im verzeichnis RMIRemoteServer drin.. es ist halt eine leere Datei und die soll dann mittels Client durch Eingaben gefüllt werden.

Nur ich komm leider nicht bis zu der Auswahl und den dazugehörigen eingaben.


----------



## yuro (16. Dezember 2011)

```
if(wahl.equals("2")){
			System.out.println("Folgende ISBN Nummern sind eingetragen: ");

			String[] tmp = new String[cds.length]; //Diese Zeile hier
			
			tmp = service.holeAlleISBN();
			
			for(int i=0; i < tmp.length; i++){
				System.out.println(tmp[i]);
			}
		}
```

Müsst ich da auch ein new String[j] machen? und als int j=0; definieren****


----------



## Akeshihiro (16. Dezember 2011)

Sorry, wenn das so direkt kommt, aber hast du dir überhaupt die Grundlagen angeschaut? Ich hab immer mehr das Gefühl, dass du von jetzt auf gleich übers Knie gebrochen eine Client-Server-Geschichte aufstellen versuchst.

EDIT:
Und dein Code müsste eigentlich so aussehen:

```
if(wahl.equals("2")){
            System.out.println("Folgende ISBN Nummern sind eingetragen: ");
 
            String[] tmp =  service.holeAlleISBN();
            
            for(int i=0; i < tmp.length; i++){
                System.out.println(tmp[i]);
            }
        }
```
Es macht kein Sinn ein neues Array zu instanziieren, wenn du die Instanz eh wieder übern Haufen wirfst und der Variable eine neue Referenz zuweist.


----------



## yuro (16. Dezember 2011)

Ja hab ich.. ich wills ja auch richtig verstehen.. warum er grad die fehlermeldung ausgibt obwohl ja die datei vorhanden ist.


----------



## Akeshihiro (16. Dezember 2011)

Wenn das bis dahin nicht bereits geklärt ist, dann schau ich mir das nachher mal an, wenn ich wieder zu Hause bin.


----------



## yuro (16. Dezember 2011)

```
public CD holeCD(String isbn) throws RemoteException {
	    int i;
	    for(i = 0; i < cds.size(); i++) {
	        if(cds.get(i).isbn.equals(isbn))
	            return cds.get(i);
	    }
	    return null;
	}
```

Dann könnt ich ja das hier genauso in der Ausgabe machen wie bei den holeAlleISBN oder?


```
if(wahl.equals("4")){
			System.out.println("Folgende CDs sind vorhanden: ");
			
			CD tmp = service.holeCD();
			
			for(int i=0; i < tmp.length; i++){
				System.out.println(tmp(i));
			}
		}
```

Wobei ich hier ja was initialisieren müsste wegen dem (String isbn) stimmts?


----------



## sheel (16. Dezember 2011)

Versteh zwar nicht wirklich, was du wo initialisieren willst,
aber du solltest dir wirklich ganz dringend den Unterscheid von
Array/ArrayList/Einzelvariable anschauen.
Und auch, was Parameterübergabe ist.


```
CD tmp = service.holeCD();
```
geht so nicht, weil du eine isbn übergeben musst.

```
String isbn;
...
CD tmp = service.holeCD(isbn);
```
Und dann bekommst du die _eine_ CD mit dieser ISBN.

Deine for-Schliefe darunter passt aber auf ein Array (CD[]) mit vielen CDs.
Und wie du dann tmp(i) ausgibst, müsste tmp eine Funktion sein.
Für Arrays gibt es tmp[i].

Einfach tmp ist die CD.

Und es macht nicht viel Sinn, eine CD auszugeben.
Ausgeben kannst du einen String. Eine Buchstabenmenge.
Oder auch Zahlen, die automatisch in Strings umgewandelt werden können.
Aber eine CD? Wie steckt man eine CD in ein paar Buchstaben?


----------



## yuro (16. Dezember 2011)

Gut das heisst er gibt mir jeweils eine CD aus ..

ich hab mal ein System.out.println(tmp); gemacht da ich ja was auf dem bildschirm sehen will.

da müsste der benutzer dann was eingeben also String isbn=scanner.next(); ... klingt mir aber nicht logisch.. dann doch eher String isbn = null; und wenn der Benutzer dann am anfang eine CD hinzufügt und wir sind dann über holeCD auslesen wird sie ins isbn reingeschrieben und im tmp ausgegeben oder?


----------



## sheel (16. Dezember 2011)

Nö. 
holeCD sucht dir zu einer ISBN die passende CD raus,
falls irgendwann mal eine passende hinzugefügt wurde.

Wenn du also holeCD verwendest, brauchst du zuerst eine ISBN, nach der gesucht wird.

Und in tmp hast du dann nicht die ISBN, die du ausgeben kannst,
sondern die ganze CD. Und die ausgeben hat da keinen Sinn.


----------



## yuro (16. Dezember 2011)

Er soll mir ja die Informationen der CD ausgeben wenn ich die gewünschte  ISBN eingebe.


----------



## sheel (16. Dezember 2011)

Dann gib entweder .kategorie usw. einzeln aus oder mach eine toString-Methode, die das tut.


----------



## yuro (16. Dezember 2011)

String isbnCD = new String().toString();

so etwa****


----------



## sheel (16. Dezember 2011)

Und was soll das bringen?
Bitte, lies dir die Javainsel durch.


----------



## Akeshihiro (16. Dezember 2011)

Na sheel, keine Lust mehr? XD

EDIT:
So, könnte mich jetzt im Prinzip damit beschäftigen ...

Mir scheint, du hast die Grundlagen nicht drauf (also entweder ein kompletter Neuling oder einfach nicht verstanden). Das können wir hier nicht korrigieren, da musst du schon selbst zusehn, dass du die entsprechenden Kapitel nacharbeitest. Das heißt, dass du die Seiten nicht einfach nur überfliegst, sondern wirklich liest und auch die Beispiele abarbeitest. Irgendwann wird das nicht mehr nötig sein, weil du dann schon beim Lesen des Codes verstehen wirst, was da gemacht wird, aber am Anfang ist das unumgänglich. Außerdem ist es immer gut die Beispiele nicht nur stumpf abzutippen (übrigens wirklich abtippen, nicht die fertigen Sources laden, weil man beim Abtippen wenigstens begrenzt über den Code nachdenkt, was beim Ausführen fertiger Sources gar nicht gegeben ist), sondern damit auch ein wenig rumspielen. Das kann eine leichte Abwandlung sein oder der Versuch das vorherige Wissen mit einfließen zu lassen oder was auch immer. Ich z.B. habe immer verschiedene Szenarien ausprobiert, um zu testen wo die Grenzen sind und habe übrigens immer noch so ein Test-Projekt, wo ich immer mal wieder eben solche Unklarheiten dann ausprobiere. Es bringt nix, wenn jemand sagt, er glaube dies und jenes. Wenn ich was benutzen will, dann will ich es auch mit Gewissheit machen und nicht auf gut Glück. Also solche Testprojekte zum Rumspielen sind meiner Meinung nach immer eine feine Sache.

So, nun zu deinem Problem:
Ich denke ich brauche mir nicht die Mühe machen und versuchen was aus dem Thread zurecht zu konstruieren. Daher also die direkte Frage: Wie sieht dein Projekt (bzw. sind vermutlich zwei) jetzt aus?


----------

