# Quadratzahlen ausgeben



## Hans-89 (18. Apr 2010)

Hallo,
ich möchte gerne Quadratzahlen, die kleiner als 1000 sind, in einer Variablen vom Typ ArrayList<integer> ausgeben lassen (mit einer while-schleife)
Ich habe folgenden Anfang, aber das klappt alles nicht so wirklich.
Kann mir jemand bitte helfen?

public class Quadratzahlen                            
{
    private ArrayList<Integer> quadratzahlen; 
    int i;

    public Quadratzahlen()
    {

        quadratzahlen = new ArrayList<Integer>();



        while (i< quadratzahlen.size())

        {
            System.out.println(quadratzahlen.get(i*i));;
            i++;
        }


   }
}


----------



## gman (18. Apr 2010)

```
while (i< quadratzahlen.size())
```

Da du "quadratzahlen" gerade erst mit *new* erzeugt hast, ist dessen Länge
natürlich 0 und die Schleife wird nicht ausgeführt. Ganz abgesehen davon das die
Variable "i" auch gar nicht initialisiert ist.

Ausserdem willst du ja testen ob die erzeugte Quadratzahl kleiner als 1000 ist und
nicht ob du schon 1000 Quadratzahlen hast.


----------



## Wortraum (18. Apr 2010)

Da ist einiges durcheinander. quadratzahlen.get(i*i) versucht, an der Stelle i² von ArrayList einen Wert zu lesen, aber dort wurde nie einer hineingeschrieben. Und warum wird der Index quadriert? Und wo wird überhaupt i initialisiert? Wo werden die Quadrate berechnet und in die Liste geschrieben?

Hier ist ein Beispiel, wie man es machen kann:

```
import java.util.ArrayList;

public class Quadratzahlen {
    private ArrayList<Integer> quadratzahlen = new ArrayList<Integer>();

    public Quadratzahlen() {
        /* leer */
    }

    public void erzeuge(int maxQuadrat) {
        int max = (int) Math.sqrt(maxQuadrat);
        for (int i = 0; i <= max; ++i) {
            quadratzahlen.add(i * i);
        }
    }

    public void zeige() {
        System.out.println(quadratzahlen);
    }
}
```
Den leeren Konstruktor kann man auch weglassen, da automatisch ein leerer Konstruktor erzeugt wird, wenn kein anderer definiert wird.

Um die Klasse zu testen, braucht man noch eine main‐Methode:

```
public static void main(String[] args) {
    Quadratzahlen qz = new Quadratzahlen();
    qz.erzeuge(100);
    qz.zeige(); /* => [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100] */
}
```

Für die Erzeugung und Abbruchbedignung der Schleife gibt es natürlich noch andere Möglichkeiten. Außerdem fügt erzeuge(int) einfach nur neue Quadratzahlen an ArrayList an, ohne diese aber vorher zu leeren oder eine neue zu erzeugen; das kann man je nach Aufgabenstellung noch ändern.

```
public void erzeuge(int maxQuadrat) {
    int quadrat = 0;
    for (int i = 1; quadrat <= maxQuadrat; ++i) {
        quadratzahlen.add(quadrat);
        quadrat = i * i;
    }
}
```

Statt der Methode zeige() sollte man besser die Methode toString() überschreiben, die automatisch jede Klasse von der Klasse Object erbt. In der main-Methode geschähe die Ausgabe dann mit _System.out.println(qz)_. Da man hierfür allerdings schon das Konzept der Vererbung verstehen muß, habe ich das im obigen Beispiel weggelassen.

```
@Override
public String toString() {
    return quadratzahlen.toString();
}
```


----------

