# [Java] Array&ArrayList - Fehler



## DiabloJulian (22. Juni 2011)

Habe hier eine Übungsaufgabe von einem Buch (Java von Kopf bis Fuß) bekommen und hab es bisher auch verstanden. Jetzt wollten wir "unser" erstes Programm schreiben (Schiffe- bzw. DotCom-Versenken). Bisher existiert nur eine Reihe mit einem "Schiff" (3 Längeneinheiten), wobei die Reihe ein Array ist. 
Zu Beginn haben wir die Aufgabe mit einem Array gelöst, aber es gab einen Bug (Es wurde immer Treffer angezeigt, obwohl man den gleichen Zellort schon einmal getroffen hat). Deshalb sollte man die Aufgabe nun mit einer ArrayList lösen. Dazu sollte man lediglich die (Einfaches)-DotCom Klasse umschreiben.

Zuvor mit Array:
	
	



```
public class EinfachesDotCom {
  int[] zellorte;
  int anzahlTreffer;


  public void setZellorte(int[] orte) {
    zellorte = orte;
  }
  
  public String prüfDich(String stringTipp) {
    int tipp = Integer.parseInt(stringTipp);
    String ergebnis = "Vorbei";
    for (int zelle : zellorte) {
      if (tipp == zelle) {
        ergebnis = "Treffer";
        anzahlTreffer++;
        break;
      }
    }
    if (anzahlTreffer == zellorte.length) {
      ergebnis = "Versenkt";
    }
    System.out.println(ergebnis);
    return ergebnis;
  }

}
```
Mit ArrayList:
	
	



```
import java.util.ArrayList;

public class DotCom
 {
  private ArrayList<String> zellorte;

  public void setZellorte(ArrayList<String> orte) {
    zellorte = orte;
  }
  
  public String prüfDich(String benutzerEingabe) {
    String ergebnis = "Vorbei";
    int index = zellorte.indexOf(benutzerEingabe);
    if(index>=0) {
      zellorte.remove(index);
      if(zellorte.isEmpty()) {
        ergebnis = "Versenkt";
      } else {
        ergebnis= "Treffer";
      }
    }
  System.out.println(ergebnis);
  return ergebnis;
  }

}
```
Nun wir mir folgender Fehler in der Spielklasse (mit der main-Methode) angezeigt:

```
DotComSpiel.java:10:14: setZellorte(java.util.ArrayList<java.lang.String>) in DotCom cannot be applied to (int[])
dasDotCom.setZellorte(orte);
```
Es ist mir klar, dass ich eigentlich kein Array deklarieren dürfte, jedoch steht im Buch keine Anmerkung auf einen Fehler und das Programm sollte eigentlich so funktionieren. Deshalb wende ich mich nun an euch, da ich davon ausgehe, dass ihr besser als ein Buch seit  .

Hier noch der Quellcode für die Spieleklasse und den Spielehelfer:



Spoiler





```
import java.util.ArrayList;

public class DotComSpiel {
  public static void main(String[] args) {
    int anzahlTipps =0;
    SpielHelfer helfer = new SpielHelfer();
    DotCom dasDotCom = new DotCom();
    int zufallsZahl = (int) (Math.random() *5);
    int[] orte = {zufallsZahl, zufallsZahl+1,zufallsZahl+2};
    [COLOR=red]dasDotCom.setZellorte(orte);    boolean lebt=true;
    
    while(lebt==true) {
      String tipp = helfer.getBenutzereingabe("Geben sie eine Zahl ein");
      String ergebnis = dasDotCom.prüfDich(tipp);
      anzahlTipps++;
      if(ergebnis.equals("Versenkt")) {
        lebt=false;
        System.out.println("Sie haben " +anzahlTipps + " Versuche benötigt");
      }
    }
    
  }
}
```






Spoiler





```
import java.io.*;
public class SpielHelfer {
  public String getBenutzereingabe(String prompt) {
    String eingabeZeile=null;
    System.out.print(prompt + " ");
    try {
      BufferedReader is = new BufferedReader(new InputStreamReader(System.in));
      eingabeZeile = is.readLine();
      if(eingabeZeile.length() == 0) return null;
    }
    catch(IOException e) {
      System.out.println("IOException: " +e);
    }
    return eingabeZeile;
  }
}
```


----------



## Fragile Heart (22. Juni 2011)

```
public void setZellorte(ArrayList<String> orte)
```
Ich frage mich warum da jetzt String steht und nicht wie in der ersten Version int? Logisch wäre ein ArrayList<int> oder etwa nicht?


----------



## DiabloJulian (22. Juni 2011)

Mit String lässt es sich kompilieren, mit int nicht.


----------



## Fragile Heart (22. Juni 2011)

Super Argument. 

Nur übergibst du ein int[] wo ein ArrayList<String> erwartet wird, was irgendwie auch ziemlich Sinnbefreit ist oder? 

Schau dir doch noch mal deine Klasse DotCom an. Wenn du auch noch die zellorte in ArrayList<int> änderst, sollte das alles gehen.


----------



## DiabloJulian (22. Juni 2011)

Das oben war kein Argument, lediglich eine Feststellung  Wenn ich argumentiere, versuche ich auch jene zu stützen.

Mit dem <int> hat es leider auch nicht geklappt.
Laut Fehleranzeige, hat das ja auch nicht mit dem Typ int zu tun, sondern mit dem Array und der ArrayList. Die Methode setZellorte mit dem Parameter ArrayList lässt sich nicht auf den int-Array anwenden. Oder hab ich da etwas falsch verstanden?


----------



## Fragile Heart (22. Juni 2011)

Die Fehlermeldung besagt nur das du kein int[] als Parameter für void setZellorte(ArrayList<String> orte) verwenden kannst.


----------



## DiabloJulian (22. Juni 2011)

Müsst ich dann nicht das Objekt orte anstatt mit Array, einfach als ArrayList deklarieren? Ist das überhaupt möglich?


----------



## Fragile Heart (22. Juni 2011)

Möglich ist letztlich fast alles, aber ich würde immer noch den Weg über den anderen Weg gehen. Also umschreiben des DotCom Objekt so, dass das alte Interface wieder geht.


----------



## DiabloJulian (22. Juni 2011)

Könnte ich machen, lediglich bringt mich das nicht weiter bzw. möchte/muss ich das Problem lösen. Denn das folgende baut darauf auf, ich probier einfach ma weiter.

Hat sonst keiner mehr Lösungsvorschläge?

€2: 
Problem gelöst, hab einen Freund gefragt. So sieht die überarbeitete DotComSpiel-Klasse aus:



Spoiler





```
import java.util.ArrayList;

public class DotComSpiel {
  public static void main(String[] args) {
    int anzahlTipps =0;
    SpielHelfer helfer = new SpielHelfer();
    DotCom dasDotCom = new DotCom();
    int zufallsZahl = (int) (Math.random() *5);

    ArrayList<String> meineListe = new ArrayList<String>();
    meineListe.add(String.valueOf(zufallsZahl));
    meineListe.add(String.valueOf(zufallsZahl + 1));
    meineListe.add(String.valueOf(zufallsZahl + 2));
    dasDotCom.setZellorte(meineListe);
    boolean lebt=true;
    
    while(lebt==true) {
      String tipp = helfer.getBenutzereingabe("Geben sie eine Zahl ein");
      String ergebnis = dasDotCom.prüfDich(tipp);
      anzahlTipps++;
      if(ergebnis.equals("Versenkt")) {
        lebt=false;
        System.out.println("Sie haben " +anzahlTipps + " Versuche benötigt");
      }
    }
    
  }
}
```


----------



## Fragile Heart (23. Juni 2011)

Natürlich hätte dich auch der andere Weg weiter gebracht, nur hätte man da halt mal ein paar Minuten schauen müssen was man noch hätte anpassen müssen.

Naja, da du aber jetzt eine Lösung hast ... Glückwunsch.


----------

