# Objekte in ArrayList eintragen und auslesen



## Speedjunkee (23. Jun 2015)

Hallo Community!

Ich habe folgendes Problem: Ich möchte eine unbestimmte Anzahl an Punkten (jeweils mit x, y & z - Wert) einlesen (zunächst über die Tastatur, später eventuell mittels eines .txt-Files) und dann von einem bestimmten Punkt die Koordinaten wieder ausgeben. Dazu habe ich die Klasse Punkt mit genannten Variablen erstellt. In der Main Methode habe ich eine ArrayList erstellt und füge in einer while-Schleife in jedem Durchlauf einen Punkt hinzu. Laut Debugger funktioniert das Hinzufügen auch. Wenn ich allerdings einen beliebigen Punkt auslesen will, dann wird immer nur der zuletzt eingegebene ausgegeben. 

Liegt es daran, dass ich in der While Schleife immer wieder den Punkt p1 überschreibe? Wenn ja, gibt es eine elegantere Methode eine unbestimmte Anzahl an Punkten einzulesen, mit denen ich dann auch weiterrechnen kann? 

Hier der Source Code:

```
public class Hauptmethode {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        Scanner sc = new Scanner(System.in);
        System.out.println("Anzahl der Punkte definieren!");
        int anzahl = sc.nextInt();
        int i = 0;
        ArrayList
 Punktliste = new ArrayList
();
        Punkt p1 = new Punkt();
        
        while ( i < anzahl)
        {
            
            System.out.println("Welche X Koordinate?");
            p1.setX(sc.nextDouble());
            System.out.println("Welche Y Koordinate?");
            p1.setY(sc.nextDouble());
            System.out.println("Welche Z Koordinate?");
            p1.setZ(sc.nextDouble());
            Punktliste.add(i, p1);
            i++;
        }
        System.out.println("Von welchem Punkt die Koordinaten anzeigen?");
        int nr = sc.nextInt();
        System.out.println("Punkt: " + nr + " X " + Punktliste.get(nr).getX());
        }
```


Ich bin Anfänger, also bin ich dankbar für jeden "einfachen Lösungsvorschlag"  
Ich arbeite übrigens mit Eclipse Luna.


----------



## strußi (23. Jun 2015)

du kannst die die anzahl der einträge über punkteliste.size(); ausgeben lassen, und hinzufügen könntest du es auch so machen das du variablen deklarierst und immer ein neues object hinzufügst (int x, y, z einlesen) und punkteliste.add( new Punkt( x, y, z)); anweist.


----------



## camelCase90 (23. Jun 2015)

Das kommt daher, dass Du immer den selben Punkt hinzugefügst.

Setz Punkt p1 = new Punkt(); Mal innerhalb der while Schleife


----------



## Speedjunkee (23. Jun 2015)

Danke für die schnellen Antworten!

Habe beide Varianten getestet, leider erfolglos...

Gibt es weitere Vorschläge?


----------



## Joose (23. Jun 2015)

Speedjunkee hat gesagt.:


> Habe beide Varianten getestet, leider erfolglos...
> 
> Gibt es weitere Vorschläge?



Wozu weitere Vorschläge wenn einer der bisherigen doch schon die richtige Lösung beinhaltet 



Speedjunkee hat gesagt.:


> ```
> Punkt p1 = new Punkt();
> 
> while ( i < anzahl)
> ...



Du erzeugst *ein*(!!!) Objekt der Klasse Punkt.
In der "while"-Schleife setzt du von diesem *einem*(!!!) Objekt die X, Y und Z Koordinate und fügst dieses Objekt zur Liste hinzu. 
--> Du hast ein Punkt Objekt erzeugt und fügst diese X-mal in die Liste hinzu! Und jedesmal änderst du von diesem Objekt die X, Y, Z Koordinate.



```
while ( i < anzahl)
        {
            Punkt p1 = new Punkt();
            
            System.out.println("Welche X Koordinate?");
            p1.setX(sc.nextDouble());
            System.out.println("Welche Y Koordinate?");
            p1.setY(sc.nextDouble());
            System.out.println("Welche Z Koordinate?");
            p1.setZ(sc.nextDouble());
            Punktliste.add(i, p1);
            i++;
        }
```


----------



## Speedjunkee (23. Jun 2015)

Danke für die Beharrlichkeit! 

Habe es jetzt mit folgendem Code zum laufen gebracht:

```
public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        
        System.out.println("Wie viele Punkte einlesen?");
        ArrayList
 Punktliste = new ArrayList
();
        
        int anzahl= sc.nextInt();
        int i = 0;
        while ( i < anzahl)
        {
 
            System.out.println("Welche X Koordinate?");
            double x=sc.nextDouble();
            System.out.println("Welche Y Koordinate?");
            double y=sc.nextDouble();
            System.out.println("Welche Z Koordinate?");
            double z=sc.nextDouble();
            Punktliste.add(new Punkt(x,y,z));
            i++;
        }
        System.out.println("Die Koordinate von welchen Punkt ausgeben?");
        int nr=sc.nextInt();
        System.out.println("Punktnummer: X=" + Punktliste.get(nr).getX() + "  Y=" + Punktliste.get(nr).getY() + "  Z=" + Punktliste.get(nr).getZ());
        
    }
```

Mein Problem bestand darin, dass in der ArrayList anscheinend Platzhalter für p1 eingefügt wurden und jedes mal wenn ich für p1 eine neue Koordinate angegeben habe, diese auf jedem Platzhalter angeglichen wurde.

Jetzt funktioniert es wie es soll!

Danke </punkt></punkt>


----------



## camelCase90 (23. Jun 2015)

Du hast einfach nur die ganze Zeit mit einem Objekt gearbeitet.

Jede Referenz in deiner ArrayList hat auf ein und das selbe Objekt gezeigt, dadurch hast du in jedem schleifen Durchlauf einfach nur die Werte in dem Objekt geändert.


----------



## strußi (23. Jun 2015)

Alternativ kannst du es auch so ausbauen

```
public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Wie viele Punkte einlesen?");
        ArrayList<Punkt> Punktliste = new ArrayList<>();

        int anzahl= sc.nextInt();
        int i = 0;
        double x, y, z;
        while ( i < anzahl)
        {
            
            System.out.println("Welche X Koordinate?");
            x=sc.nextDouble();
            System.out.println("Welche Y Koordinate?");
            y=sc.nextDouble();
            System.out.println("Welche Z Koordinate?");
            z=sc.nextDouble();
            Punkt p =new Punkt( x, y, z);
            Punktliste.add( p);
//            Punktliste.add(new Punkt(x,y,z)); //alternativ
            i++;
        }
        System.out.println("Die Koordinate von welchen Punkt ausgeben?");
        int nr=sc.nextInt();
        System.out.println("Punktnummer: X=" + Punktliste.get(nr).getX()
                                    + "  Y=" + Punktliste.get(nr).getY()
                                    + "  Z=" + Punktliste.get(nr).getZ());
    }
```


----------

