# Array um ein Feld erweitern



## Laren (21. Jan 2011)

Hi,

Ich hab von der Uni eine Aufgabe bekommen, in der es darum geht, dass ich ein kleines Programm schreiben soll, in der ich Projekte mit Aufgaben anlegen soll:
z.b. folgende Ausgabe:


Projekt 1. Haus bauen         Aufgaben: Steine besorgen, Tür kaufen....
Projekt 2. einkaufen gehen   Aufgaben: Milch kaufen, Eier kaufen.....


Jetzt wollte ich das einfach per Array realisieren. Problem ist, dass ich das Array dynamisch machen will.
Hier die Klasse Projektbestandteil, sie ist eine Oberklasse.


```
public class Projektbestandteil
{
 // protected String name;
//  protected String beschreibung;

  //+++++++++Attribute**********

  
  private int projektZaehler=1;

  
  //++++++++++Kosntante++++++++++++
  private final String FRAGEARRAYGROESSE = "Welche Anzahl?";



    /**
     * Konstruktor für Objekte der Klasse Projektbestandteil
     */
    
  public Projektbestandteil() {}

  
    public Projektbestandteil(String name, String beschreibung)
    {

    }
     public void neuesProjektObjekt(String name, String beschreibung)
    {
   
       System.out.println(projektZaehler);
       Projekt projektTab[] = new Projekt [projektZaehler];                         //Array wieder initialiesiert
       projektTab[projektZaehler-1]=new Projekt(name,beschreibung,10);              //dem Array wird ein Objekt zugewiesen 
       
       Projekt kopie[] = new Projekt [projektZaehler+1];                           //es wird ein neues Array mit der um 1 erhöhte Anzahl an Feldern erzuegt
       System.arraycopy(projektTab,0,kopie,0,projektZaehler);
       
       System.out.println(projektZaehler);
       if(kopie != null) 
       {
           System.arraycopy(kopie,0,projektTab,0,projektZaehler);
        }
        projektZaehler++;         //die Größe des Array wird um 1 Feld erhöht
       
        
        
    }
    
        public void neueAufgabe(String name, String beschreibung, double aufwand)
    {
//     wird eingeführt, sobald ein Dialog vorhanden ist    
//         if(aufgabe==ENTWURF){
//             aufgabe=ENTWURF
//             else
//             aufgabe=PRODUKTION
//         }

    }
        public void neuesProdukt(String name, String beschreibung, double produktionskosten)
    {
 
    }
    
    public void add(Projektbestandteil uebergabe)
    {
        
    }
    
 

}
```

Mein Ansatz funktioniert schon, er erweitert das Array um ein Objekt, aber er löscht das Array immer wieder komplett und schreibt nur ein neues Objekt rein. Er soll aber das alte Array kopieren und um ein Feld erweitern, dass wiederum ein neues Objekt bekommen soll.

Ich danke euch.

Grüße


----------



## Gast2 (21. Jan 2011)

Du kannst eine ArrayList nutzen, die ist genau dafür gedacht.


----------



## fjord (21. Jan 2011)

Das was du machen willst würde in etwa so aussehen:
	
	
	
	





```
public class ArrayVergroessern {
	private int[] array;
	
	public ArrayVergroessern(int[] array) {
		this.array = array;
	}
	
	public void add(int i) {
		int[] newArray = new int[array.length+1];
		System.arraycopy(array, 0, newArray, 0, array.length);
		array = newArray;
		array[array.length-1] = i;
	}
	
	public String toString() {
		return java.util.Arrays.toString(array) + ", length: " + array.length;
	}
	
	public static void main(String[] args) {
		ArrayVergroessern a = new ArrayVergroessern(new int[]{1, 2, 3, 4});
		System.out.println(a);
		a.add(5);
		System.out.println(a);
	}
}
```
Allerdings hast du damit das Problem, dass bei jedem Hinzufügen jedesmal das komplette Array kopiert werden muss. Bei kurzen Arrays fällt das nicht auf, ist aber kein sauberer Programmierstil, solltest du dir also nicht angewöhnen.

Besser ist, wie EikeB schon sagte, eine ArrayList zu benutzen. Da wird intern im Grunde das gemacht was du vorhast, allerdings wird das Array, wenn es nötig ist, gleich deutlich vergrößert, um die Performance zu verbessern.


----------



## Laren (22. Jan 2011)

hab es jetzt mit Array List gemacht und es funktioniert prima
Aber jetzt kommt direkt das nächste Problem:

Bei dem Programm soll man Projekte anlegen können, die aus Aufgaben, Produkten und Teilprojekten(die wiederum wieder aus Aufgben und Produkten bestehen kann) bestehen.

Meine Idee war einfach dies in einer Matrix zu realisieren.

Hier in einem Vektor(diese funktioniert):

```
import de.htw.saarland.stl.*;
import java.util.ArrayList;
import java.util.List;
/**
 * Beschreiben Sie hier die Klasse Projektbestandteil.
 * 
 * @author (Ihr Name) 
 * @version (eine Versionsnummer oder ein Datum)
 */
public class Projektbestandteil
{


    //+++++++++Attribute**********

    ArrayList<Projekt> projektTab = new ArrayList<Projekt>();    //Array wieder initialiesiert

 

    /**
     * Konstruktor für Objekte der Klasse Projektbestandteil
     */

    public Projektbestandteil() {}

    public Projektbestandteil(String name, String beschreibung)
    {

    }

    public void neuesProjektObjekt(String name, String beschreibung)
    {

      Projekt p = new Projekt(name,beschreibung,10);
      projektTab.add(p);              //dem Array wird ein Objekt zugewiesen 


    }

}
```

Hier die Klasse erweitert(aus dem Vektor soll ne Matrix werden):

```
import de.htw.saarland.stl.*;
import java.util.ArrayList;
import java.util.List;
/**
 * Beschreiben Sie hier die Klasse Projektbestandteil.
 * 
 * @author (Ihr Name) 
 * @version (eine Versionsnummer oder ein Datum)
 */
public class Projektbestandteil
{


    //+++++++++Attribute**********


    ArrayList<ArrayList<Projekt>> projektTab = new ArrayList<ArrayList<Projekt>>(); //Array wieder initialiesiert


    /**
     * Konstruktor für Objekte der Klasse Projektbestandteil
     */

    public Projektbestandteil() {}

    public Projektbestandteil(String name, String beschreibung)
    {

    }

    public void neuesProjektObjekt(String name, String beschreibung)
    {

        Projekt p = new Projekt(name,beschreibung,10);
      projektTab.add(p);              //dem Array wird ein Objekt zugewiesen<<---hier knallt es dann 


    }
        public void neuesTeilProjektObjekt(String name, String beschreibung)
    {
 
         Teilprojekt tp = new Teilprojekt(name,beschreibung,10);

        int wahl= Stdin.readInt("Welchem Projekt wollen sie ein TeilProjekt hinzufügen?");
       projektTab.get(wahl).add(tp);                                                 //hier knallt es auch noch
    }
```

Was muss ich verändern?

Grüße


----------



## nrg (22. Jan 2011)

imho viel .

so ins Blaue würde ich 3 Klassen empfehlen:

*Projekt*
Attribute: List<Aufgabe>, List<Produkt>, List<Projekt>
*Aufgabe*
*Produkt*


----------



## Laren (22. Jan 2011)

> imho viel .
> 
> so ins Blaue würde ich 3 Klassen empfehlen:
> 
> ...



Die 3 Klassen hab ich natürlich
Ich habe eben nur die Klasse Projektbestandteile online gestellt.


----------



## nrg (22. Jan 2011)

ja gut. was ist dann die Frage??

was unterscheidet ein Teilprojekt von einem Projekt? warum hast du dafür 2 Klassen?


----------



## Laren (22. Jan 2011)

Klasse Projekt

```
import de.htw.saarland.stl.Stdin;

public class Projekt extends Projektbestandteil {

    private double stundensatz;
    private String name;
    private String bezeichnung;
    private String daten;
    private int oberprojekt;
    public Projekt() {}

   public Projekt (String name, String bezeichnung, double stundensatz) 
   {
        super(name, bezeichnung);
        this.stundensatz=stundensatz;
        daten= "Name: "+name+" Beschreibung "+bezeichnung;
    }
  
   
   public String getDaten()
   {
       return daten + " Stundensatz "+ stundensatz;
   }

}
```
Klasse Teilprojekt

```
public class Teilprojekt extends Projektbestandteil
{
    private double stundensatz; 
    private String name;
    private String bezeichnung;
    private String daten;
    /**
     * Konstruktor für Objekte der Klasse Teilprojekt
     */
    public Teilprojekt()
    {}
    
    public Teilprojekt(String name, String beschreibung, double stundensatz)
    {
        super(name,beschreibung);
        this.stundensatz=stundensatz;
         daten= "Teilprojekt Name: "+name+" Beschreibung "+bezeichnung;
    }
       public String getDaten()
   {
       return daten + " Stundensatz "+ stundensatz;
   }


}
```

Klasse Aufgabe

```
import de.htw.saarland.stl.Stdin;

public class Aufgabe extends Projektbestandteil {

    private double aufwand;
    
    public Aufgabe() {}

    public Aufgabe (String name, String beschreibung, double aufwand) {
        super(name, beschreibung);
        this.aufwand = aufwand;
    }



}
```

Klasse Produkt

```
import de.htw.saarland.stl.Stdin;

public class Produkt extends Projektbestandteil {

    private double produktionskosten;
    
    public Produkt() {}

    public Produkt (String name, String beschreibung, double produktionskosten) {
        super(name, beschreibung);
        this.produktionskosten = produktionskosten;
    }

}
```



> ja gut. was ist dann die Frage??
> 
> was unterscheidet ein Teilprojekt von einem Projekt? warum hast du dafür 2 Klassen?





Wie bekomme ich es hin, dass ich mehrere Projekte anlegen kann, dass ich mit mehreren AufgabeObjekten und ProdukteObjekten füllen kann .

oder anders gefragt:
Eine Arraylist , die 2 weitere Arraylists enthält? Eine 3d Arraylist eben?

Grüße


----------



## nrg (22. Jan 2011)

nachdem ich grad Langeweile habe, hier mal ein "kleines" Beispiel (lehnt an deinen Code an):

Class Projekt:

```
import java.util.ArrayList;
import java.util.List;

public class Projekt {

	private double stundensatz;
	private String bezeichnung;
	private List<Projekt> teilprojekte;
	private List<Aufgabe> aufgaben;
	private List<Produkt> produkte;

	public Projekt (String bezeichnung, double stundensatz) {
		this.stundensatz = stundensatz;
		this.bezeichnung = bezeichnung;
		this.teilprojekte = new ArrayList<Projekt>();
		this.aufgaben = new ArrayList<Aufgabe>();
		this.produkte = new ArrayList<Produkt>();
	}
	
	public void addTeilprojekt(Projekt projekt) {
		teilprojekte.add(projekt);
	}
	
	public void addAufgabe(Aufgabe aufgabe) {
		aufgaben.add(aufgabe);
	}
	
	public void addProdukt(Produkt produkt) {
		produkte.add(produkt);
	}
	
	public double getUmsatz() {
		double aufwand = 0.0, kosten = 0.0;
		for (Aufgabe a : aufgaben)
			aufwand += a.getAufwand();
		for (Produkt p : produkte)
			kosten -= p.getKosten();
		return kosten + aufwand * stundensatz;
	}
	
	public String getDaten() {
		StringBuilder sb = new StringBuilder();
		sb.append(bezeichnung + "\n");
		double gesamtumsatz = getUmsatz();
		for (int i = 0; i < aufgaben.size(); i++)
			sb.append("Augabe " + (i+1) + ": " + aufgaben.get(i).getDaten() + "\n");
		for (int i = 0; i < produkte.size(); i++)
			sb.append("Produktionskosten " + (i+1) + ": " + produkte.get(i).getDaten() + "\n");
		for (int i = 0; i < teilprojekte.size(); i++) {
			sb.append("Teilprojekt " + (i+1) + ": " + teilprojekte.get(i).getDaten());
			gesamtumsatz += teilprojekte.get(i).getUmsatz();
		}
		sb.append("Gesamtumsatz " + bezeichnung + " = " + gesamtumsatz + "\n");
		return sb.toString();
	}
}
```

Class Aufgabe:

```
public class Aufgabe {
	
    private double aufwand;
    private String bezeichnung;
    
    public Aufgabe(String bezeichnung, double aufwand) {
    	this.bezeichnung = bezeichnung;
        this.aufwand = aufwand;
    }
    
    public double getAufwand() {
    	return aufwand;
    }
    
    public String getDaten() {
    	return bezeichnung + ": " + aufwand + " Stunden";
    }
}
```

Class Produkt:

```
public class Produkt {
	
    private double kosten;
    private String bezeichnung;
    
    public Produkt(String bezeichnung, double kosten) {
    	this.bezeichnung = bezeichnung;
        this.kosten = kosten;
    }
    
    public double getKosten() {
    	return kosten;
    }
    
    public String getDaten() {
    	return bezeichnung + ": " + kosten + " €";
    }
}
```

Class Main:

```
public class Main {
	public static void main(String[] args) {
		Projekt bauen = new Projekt("Garagenbau", 20);
		bauen.addAufgabe(new Aufgabe("Matieralen bestellen", 2));
		bauen.addAufgabe(new Aufgabe("Garage mauern", 10));
		bauen.addProdukt(new Produkt("Backsteine", 300));
		
		Projekt streichen = new Projekt("Garage streichen", 20);
		streichen.addAufgabe(new Aufgabe("Farbe bestellen", 2));
		streichen.addAufgabe(new Aufgabe("Garage streichen", 10));
		streichen.addProdukt(new Produkt("Farbe", 100));
		
		bauen.addTeilprojekt(streichen);
		System.out.println(bauen.getDaten());
	}
}
```

edit: ist jetzt auch eher quick&dirty. also wenn jemand irgendwo einen Fehler findet, kann er ihn auch gerne behalten . geht jetzt nur um ein Beispiel für den TO


----------



## nrg (22. Jan 2011)

Ahja. Die Antwort auf die Frage


Laren hat gesagt.:


> Wie bekomme ich es hin, dass ich mehrere Projekte anlegen kann, dass ich mit mehreren AufgabeObjekten und ProdukteObjekten füllen kann .



Habe ich dir btw schon oben gesagt 


nrg hat gesagt.:


> *Projekt*
> Attribute: List<Aufgabe>, List<Produkt>, List<Projekt>



Aber gut. Jetzt siehst du es ja im Code...


----------



## Laren (22. Jan 2011)

Ich danke dir, werde ich mal gerade umsetezn:toll:


----------



## Laren (23. Jan 2011)

Hab jetzt dein Beispiel umgesetzt und das kahm raus(wir musste aus der Aufgabe raus eine Superklasse erstellen):

Die Superklasse Projektbestandteil

```
import de.htw.saarland.stl.*;
import java.util.ArrayList;
import java.util.List;

public class Projektbestandteil
{
 
 
    //+++++++++Attribute**********
 
    private List<Projekt> projekte;
    private List<Projekt> teilprojekte;
    private List<Aufgabe> aufgaben;
    private List<Produkt> produkte;
    private double stundensatz;
    private String bezeichnung;
 
    /**
     * Konstruktor für Objekte der Klasse Projektbestandteil
     */
 
    public Projektbestandteil() {}
 
    public Projektbestandteil(String name, String beschreibung)
    {
        this.projekte = new ArrayList<Projekt>();
        this.teilprojekte = new ArrayList<Projekt>();
        this.aufgaben = new ArrayList<Aufgabe>();
        this.produkte = new ArrayList<Produkt>();
    }
 
        public void addProjekt(String name,String bezeichnung) 
    {
        Projekt p = new Projekt(name,bezeichnung,10);
        projekte.add(p);
 
    }
 

    public void addTeilprojekt(String name,String bezeichnung) 
    {
        Projekt tp = new Projekt(name,bezeichnung,10);
        teilprojekte.add(tp);
    }

    public void addAufgabe(Aufgabe aufgabe,String name, String beschreibung) 
    {
        Aufgabe au = new Aufgabe(name,beschreibung,10);
        aufgaben.add(au);
        
    }

    public void addProdukt(Produkt produkt,String name, String beschreibung)
    {
        Produkt pr = new Produkt(name,beschreibung,10);
        produkte.add(pr);
    }
   public double getUmsatz() 
    {
        double aufwand = 0.0, kosten = 0.0;
        for (Aufgabe a : aufgaben)
            aufwand += a.getAufwand();
        for (Produkt p : produkte)
            kosten -= p.getKosten();
        return kosten + aufwand * stundensatz;
    }

    public String getDaten()
    {
        StringBuilder sb = new StringBuilder();
        sb.append(bezeichnung + "\n");
        double gesamtumsatz = getUmsatz();
        for (int i = 0; i < aufgaben.size(); i++)
            sb.append("Augabe " + (i+1) + ": " + aufgaben.get(i).getDaten() + "\n");
        for (int i = 0; i < produkte.size(); i++)
            sb.append("Produktionskosten " + (i+1) + ": " + produkte.get(i).getDaten() + "\n");
        for (int i = 0; i < teilprojekte.size(); i++) {
            sb.append("Teilprojekt " + (i+1) + ": " + teilprojekte.get(i).getDaten());
            gesamtumsatz += teilprojekte.get(i).getUmsatz();
        }
        sb.append("Gesamtumsatz " + bezeichnung + " = " + gesamtumsatz + "\n");
        return sb.toString();
    }



}
```

Klasse Projekt

```
import java.util.ArrayList;
import java.util.List;

public class Projekt extends Projektbestandteil
{
    private double stundensatz;
 
    
 
   public Projekt(){}
   public Projekt (String name, String bezeichnung, double stundensatz) 
   {
        super(name, bezeichnung);
        this.stundensatz=stundensatz;

    }




 
}
```
Klasse Aufgabe

```
public class Aufgabe extends Projektbestandteil
{
    
    private double aufwand;
    private String bezeichnung;
    
    public Aufgabe() {}

    public Aufgabe (String name, String beschreibung, double aufwand) {
        super(name, beschreibung);
        this.aufwand = aufwand;
    }
    
    public double getAufwand() 
    {
        return aufwand;
    }
    
    public String getDaten() 
    {
        return bezeichnung + ": " + aufwand + " Stunden";
    }
}
```
Klasse Produkt

```
public class Produkt extends Projektbestandteil
{
    
    private double kosten;
    private String beschreibung;
    
    public Produkt(String name,String beschreibung, double kosten) {
        this.beschreibung = beschreibung;
        this.kosten = kosten;
    }
    
    public double getKosten() {
        return kosten;
    }
    
//     public String getDaten() {
//     //    return name + ": " + kosten + " €";
//     }
}
```
Klasse Projektbestandteil

```
import de.htw.saarland.stl.*;

public class Projektdialog extends Projektbestandteil

{
    private final static String FRAGEPROJEKTNAME = "Name des Projektes?";
    private final static String FRAGEPROJEKTBESCHREIBUNG="BEschreibung?";

    String name;
    String beschreibung;
    private final int ENDE = 0;
    private final int NEUESPROJEKT = 1;
    private final int NEUESTEILPROJEKT = 2;
    private final int AUSGABE = 3;
    /**
     * Konstruktor für Objekte der Klasse Projektdialog
     */
    public Projektdialog(){}

    public Projektdialog(String name, String bezeichnung){
        super(name,bezeichnung);
    }

    public static void main(String[] args)
    {

        Projektdialog pd = new Projektdialog();
        pd.start();
    }

    public void start()
    {
        Projektbestandteil pb = new Projektbestandteil ();
        this.neuesProjekt();
        System.out.println();

    }

    public void neuesProjekt()
    {
        int funktion=-1;

        while(funktion !=0)
        {

            System.out.println(NEUESPROJEKT+" Neues Projekt anlegen");
            System.out.println(NEUESTEILPROJEKT+" Neues Teilprojekt anlegen");
            funktion = Stdin.readInt("Was soll getan werden");
            switch(funktion)
            {
                case NEUESPROJEKT:
                name=Stdin.readString("Wie soll das Projekt heissen?");
                beschreibung=Stdin.readString("Bitte beschreiben sie ein wenig das neue Projekt");
                super.addProjekt(name,beschreibung);
                break;

                case NEUESTEILPROJEKT:
                
                name=Stdin.readString("Wie soll das Teilprojekt heissen?");
                beschreibung=Stdin.readString("Bitte beschreiben sie ein wenig das neue Projekt");
                super.addTeilprojekt(name,beschreibung);
                break;

            }
        }
        System.exit(0);
    }

}
```

Ich habe jetzt nur weiterhin das Problem, dass ich Projekte, Aufgaben und Produkte anlegen kann, die aber unabhängig voneiader in eine Liste stehen. 
Wie schaff ich es, dass mich die Konsole frägt:

1. Wollen Sie ein neues Projekt anlegen
2. Wollen Sie ein neues Teilprojekt anlegen  (dann: welchem Projekt wollen sie dieses hinzufügen)
3. Wollen Sie einem Projekt/Teilprojekt eine neue Aufgabe hinzufügen (welchem  Projekt/Teilprojekt)
4. Wollen Sie einem Projekt/Teilprojekt eine neues Produkt hinzufügen (welchem  Projekt/Teilprojekt)


Viele Grüße


----------



## nrg (23. Jan 2011)

die superklasse hätte ich anders gewählt. so macht das imho keinen sinn. warum solllte eine Aufgabe eine Liste von Aufgaben, Projekte etc enthalten?

Eine "Shellgui" wirst du wohl noch selber hinbringen. Ansonten würde ich vorschlagen, postet du die ganze Aufgabe im Bereich Jobbörse... Oder besser: du gönnst dir Fachliteratur, weil so wirds schwer für dich.


----------



## Laren (28. Jan 2011)

habs noch hinbekommen, bekahm aber abzug wegen der Superklasse, das werde ich wohl nochmal nachlesen, aber danke


----------

