# Array mit unbestimmter länge



## Nerolex (27. Jul 2015)

Hallo zusammen!

Ich quäle mich schon seit ein paar Tagen mit einem Problem rum:



Es sollen beliebig viele zahlen eingegeben werden die dann in einem Array gespeichert werden sollen*.*

Das ganze soll solange weitergehen bis man eine bestimmte Zahl (zB: 134) eingibt.

Ich habe im internet nicht wirklich hilfreiches gefunden

Würde mich auf "nicht zu schwere" antworten freuen obwohl ich jede berücksichtigen werde.

Grüße,
Alex


----------



## MWin123 (27. Jul 2015)

Die Größe von einem Array kann man nicht ändern.


----------



## Ch4t4r (27. Jul 2015)

So gesehen hat jedes Array eine Länge (schließlich muss das System wissen, wieviel RAM benötigt wird), die so erstmal feststeht. Für dein Problem fallen mit spontan diese Lösungen ein:
- ArrayList verwenden (Größe ist variabel)
- Bei jeder neuen Zahl ein neues array (Länge +1) anlegen und den alten Inhalt kopieren, letztes Element ist dann die neue Zahl (nicht sehr effizient)
- ein Array mit Platz für viele Elemente anlegen und nur soweit belegen, wie benötigt (ebenfalls ineffizient und resourcenlastig)


----------



## Nerolex (27. Jul 2015)

Danke für eure antworten!

Ich werde es mal mit der ArrayList probieren.


----------



## skuki (27. Jul 2015)

Würde auch eine ArrayList vorschlagen, die ganz einfach gefüllt und durchsucht werden kann.


----------



## Anfänger2011 (27. Jul 2015)

Hi Nerolex,

hab das schnell mal eben geschrieben. Dann kannst dich daran etwas orietieren bzw. deinen Bedürfnissen / Vorgaben anpassen. 

Hier der Code:

```
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package pkg134;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
*
* @author dominik
*/
public class Main extends JFrame implements ActionListener {

    private static JPanel panel = new JPanel();
    private static int width, height;
    private int checkNumber;
    private JButton button;
    private JTextField textfield;
    private ArrayList <Integer> arrayList = new ArrayList <Integer> ();
   
    public Main(){
        width = 150; //groeße des Frames
        height = 100;// "  "  "
        checkNumber = 134; //die kannst du dann ja deinen wuenschen anpassen ...
        initSwingForms(); //initieren der Swingformen Button und TextField
        setSwingForms(); //Einstellungen setzen wie groeße und Position
        addSwingForms(); //Formen dem Panel hinzufuegen
    }
   
    public void initSwingForms(){
        button = new JButton("Bestätigen");
        textfield = new JTextField("Gib eine Zahl ein ...");
    }
   
     public void setSwingForms(){
        //button kannst du hier selber zurechtrücken und ebenso das textfeld
        //button.setSize();
        //button.setLocation();
       
        //button einen ActionListener hinzufuegen um klicks zu registrieren
        button.addActionListener(this);
       
        //fields
        //textfield.setSize();
        //textfield.setLocation();
     }
    
    private void addSwingForms(){
        panel.add(textfield);
        panel.add(button);
    }
   
    public static void main(String[] args) {
        Main frame = new Main();//Frame erzeugen
        frame.setSize(width, height);//groeße setzen
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE); // damit sich das Programm später richtig schließt
        frame.add(panel); // auf das Panel gezeichnete SwingFormen dem Frame hinzufuegen
        frame.setVisible(true); //frame sichtbar machen
    }
   
    //alle eintraeger der arraylist ueberpruefen lassen - macht sinn wenn du die positionen switchen willst
    private void checkAll(int n){
        for(int x=0; x < arrayList.size(); x++){
            if(arrayList.get(x) == n){
                JOptionPane.showMessageDialog(null, "Die Zahl " + n + " wurde gefunden!");
            }
        }
    }
   
    //check nur den letzten eintrag - bessere performance
    private void checkLast(int n){
        int temp = arrayList.size();
        if(arrayList.get(temp) == n){
            JOptionPane.showMessageDialog(null, "Die Zahl " + n + " wurde gefunden!");
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //prueft ob button geklickt wurde
        if(e.getSource() == button){
            //fuegt der arraylist an letzter position hinzu
            arrayList.add(Integer.valueOf(textfield.getText()));
            //fuehrt check aus
            checkLast(checkNumber);
        }
    }
   
}
```

Hoffe das hilft dir weiter. Über ein Daumenhoch würde ich mich freuen


----------



## Ch4t4r (27. Jul 2015)

Anfänger2011 hat gesagt.:


> Hi Nerolex,
> 
> hab das schnell mal eben geschrieben. Dann kannst dich daran etwas orietieren bzw. deinen Bedürfnissen / Vorgaben anpassen.
> 
> ...



Auch wenn du dir da bestimmt Arbeit gemacht hast, lernt man damit nicht gerade viel (einige Verstöße gegen die Code-Konventionen mal abgesehen ^^)


----------



## Flown (27. Jul 2015)

Wow ich muss @Ch4t4r einfach recht geben. Dieser Code den du geliefert hast @Anfänger2011 ist einfach nichts zum herzeigen. Damit hilfst du keinem.
Paar Punkte:

Man leitet nicht von JFrame ab
Anonyme ActionListener-Codes reichen völlig aus
Alle Felder unnötig
static falsch verwendet
deine CheckLast-Methode sinnlos (warum nicht gleich überprüfen?)
Man implementiert gegen Interfaces (`List<...> list = new ArrayList<>();`)
Sprechende Namen für Klassen wählen
Warum eigentlich eine Swing-Anwendung? Es reicht für so eine Übung wirklich nur eine Konsolenanwendung und mehr wurde auch nicht gefordert.


----------



## Anfänger2011 (28. Jul 2015)

Danke das ist ja gut zu wissen. Bis jetzt hab ich das immer so mit guten Gewissens wie in meinen Buch gemacht. Also abgesehen von dem schlecht gewählten Klassennamen und der relativ unnötigen Methode Checklast natürlich.


----------



## Flown (28. Jul 2015)

Ja die Bücher und solche Swing-Sachen. Keine Ahnung warum die immer von JFrame (und ActionListener implementieren) ableiten, aber ich nehme an, dass das Tutorial dann in eine Klasse passt.


----------



## JStein52 (1. Aug 2015)

Was ist das für eine Regel, nicht von JFrame abzuleiten ?   Warum nicht ?


----------



## black swan (2. Aug 2015)

Ich glaube es gibt keine Regel, "nicht von JFrame abzuleiten", sondern man sollte sich überlegen, wann man grundsätzlich von einer Klasse ableitet (bspw. du möchtest die Klasse von der Du ableitest erweitern oder überschreiben). In Deinem Fall gibt es keine Grund abzuleiten, da Du JFrame lediglich instanzierst.


----------



## Flown (7. Aug 2015)

Ist schon eine Weile her, da ich auf Urlaub war, aber ich möchte hier auf diesen Thread verweisen, der sehr gut erklärt, warum "Composition over Inheritance" besser ist: HIER.


----------

