# element in ArrayList Hinzufügen



## guguli (30. Okt 2013)

Hi zusammen,

Ich möchte gerne eine Methode Schreiben, womit ich ein übergebenes Element in einem bestehenden Array hinzufügen kann.
meine idee ist zuerst ein ArrayObjekt erzeuge , dann und dann zuerst alle Alemente des ersten Arrays da rin tun dann das letzte element.

```
public ArrayList hinzufügen(int newElement) {
          ArrayList[] newArray = new ArrayList[data.length + 1];
    	 for(int i = 0; i < data.length;i++){
    		
    	 }
}
```

Wie kann ich nun den letzte schritt, also die elemenete in newArray einfügen???


THX


----------



## nomuri (30. Okt 2013)

newArray.add()


----------



## guguli (30. Okt 2013)

aber das alte Array soll ja unverändert beiben und das neue element einfach dran gehangn werden:
[2,3,1] hinzufügen(5) --> [2,3,1,5]


----------



## MrClave (30. Okt 2013)

Wieso erstellst du ein Array von Typ ArrayList ?
Demnach hättest dann ja dutzende ArrayListen. Wozu ?

Schreib' noch mal schön langsam, was genau du vor hast.
Willst du nun etwas in ein Array ODER eine(/viele) ArrayList(en) schreiben ?


----------



## Natac (30. Okt 2013)

Mir scheint, du hast die Klasse 
	
	
	
	





```
java.util.ArrayList
```
 nocht nicht ganz verstanden.

Ich empfehle dir allgemein, die Dokumentation einer Klasse durchzulesen, bevor du diese verwendest.

Um dir den Einstieg zu erleichtern: Dokumentation von java.util.ArrayList


----------



## kaoZ (30. Okt 2013)

das alte Array bleibt ja unverändert , Daten die du neu hinzufügst werden lediglich hinten an die liste angehängt, ausser du weist ihr einen festen Index zu.

Wenn du z.B "Hallo", "Welt" bereits hinzugefügt hast,

belegt "Hallo" index[0]

und "Welt" index[1]

wenn du jetzt mit 
	
	
	
	





```
deineArrayList.add("irgendwas")
```
 hinzufügst landet es in der List auf index[2]

das ist ja der Sinn von ArrayList im Vergleich zu einem Normalen Array, ebend das diese sich automatisch erweitert und keine festgelegte länge hat .

Desweiteren sollte man bei einer ArrayList den zu speichernden Datentyp angeben z.B


```
ArrayList<String> MeineArrayList = new ArrayList<String>();
```


----------



## guguli (30. Okt 2013)

Also, meine Klasse Heißt "ArrayList", ja ich hab mich vertan. und die Elemnte meiner List sind int. hab das korrigiert:

```
public ArrayList append(int newElement) {
    	
    	if(newElement <0){
    		return null;
    	}
    	 int [] newArray = new int[data.length + 1];
    	 for(int i = 0; i < data.length;i++){
    		 newArray[i] = data[i]
    	 }
    }
```
so copiere ich die Elemente von data in newArray. wie kann ich nun das newElement am ander anhängen. mit newArray.add(newElement); geht es nicht.


----------



## geqoo (30. Okt 2013)

Deine ArrayList-Deklaration ist falsch. Du erzeugst ein Array aus ArrayListen. Eine ArrayList hat aber eine dynamische Länge und braucht deshalb keine vorgegebene Größe.
Wie heißt denn dein bestehendes Array?

Beispiel:


```
class ArrayTest {
  private ArrayList<int> list;

  public ArrayTest() {
    this.list = new ArrayList<int>();
  }

  public void addElement(int newElement) {
    this.list.add(newElement);
  }
}
```

Fertig. Nicht so ein kaputtes Konstrukt verwenden, wie du es gerade tust.
Alternativ, so wie du es haben willst:


```
public ArrayList<int> append(ArrayList<int> list, int newElement) {
  if(newElement <0){
    return null;
  }

  list.add(newElement)

  return list;
}
```


----------



## guguli (30. Okt 2013)

Ja aber das ist bei mir so vorgegeben. ihc muss das so benutzen .

```
public ArrayList append(int newElement) {
    	
    	if(newElement <0){
    		return null;
    	}
    	 int[] newArray = new int[data.length + 1];
    	 for(int i = 0; i < data.length;i++){
    		 newArray[i] = data[i];
    	 }
    	 newArray[data.length + 1]=newElement;
		return null;
    	 
    }
```
wobei return null; macht mir sorge. Ich versuche gerad eine main method zu schreiben, um das auch zu testen.

Muss noch sagen dass data die Elemente der liste enthält und ist private. meine Main ist dann so :

```
public static void main(String[] args) {
		int[] data = { 2, 3, 5, 7};
		int newElement = 8;
		append(newElement);

	}
```

Aber kriege die Fehler meldung dass append static sein soll. ist Main richtig so`????


----------



## geqoo (30. Okt 2013)

Aus einem statischen Kontext kannst du auch nur statische Methoden aufrufen.
append muss daher auch static sein.


----------



## guguli (30. Okt 2013)

Also mein Rückgabewert ist ja vom typ ArrayList. und meine daten vom typ int[]. wie kann ich jetzt newArray zurückgeben.

```
public class ArrayList {   
    private int[] data;
    public ArrayList() {
	this.data = new int[0];
    }
public ArrayList append(int newElement) {
  
    	if(newElement <0){
    		return null;
    	}
    	  int[] newArray = new int[data.length + 1];
    	 for(int i = 0; i < data.length;i++){
    		 newArray[i] = data[i];
    	 }
    	 newArray[data.length + 1]=newElement;
		return  ...;
    	 
    }
public void main(String[] args) {
		int[] data = { 2, 3, 5, 7};
	
		append(8);

	}
```
das ist das was ich implementiert habe. ich will ja wenn ich append aufrufe das bekomme [2,3,5,7,8]
dazu muss ich ja newArray rütuck geben, aber wenich return newArray schreibe dann wiill er das nicht weil meine rückgabe wert vom Typ ArrayList ist. wie kann ich das problem beheben??

THX


----------



## geqoo (30. Okt 2013)

Deine geforderter Rückgabewert stimmt eben nicht mit dem zurückgegebenen Wert überein.
Statt public ArrayList append einfach public int[] append schreiben.

PS: Deine Klasse solltest du nicht ArrayList nennen, da dieser Name schon für eine von Java definierte Klasse vergeben ist.


----------



## guguli (30. Okt 2013)

Also, das ist irgendwie nicht so ganz richtig. ich darf den Rückgabe wert nicht ändern.

```
public class ArrayList {

    private int[] data;

    public ArrayList() {
	this.data = new int[0];
    }
 public ArrayList append(int newElement) {
  
    	if(newElement <0){
    		return null;
    	}
    	  ArrayList newArray = new ArrayList();
    	 
    	 }
    	
		
    	 
    }
```
Ich verstehe jetzt nicht mehr wie ich append implementieren kann. kann mir da einer Weiterhelfen.


----------



## calousy (30. Okt 2013)

das klappt so nicht.

1) ArrayList ist eine Klasse, die bereits in java.util implementiert ist (ArrayList (Java Platform SE 6)). Hier gibt's also Namenskonflikte, daher auch die Verwirrung bei den anderen hier. Kannst du die nicht umbenennen, bzw. ist in der Aufgabenstellung verlangt, dass du diese Klasse selbst implementieren musst?

2) in deinem Konstruktor initialisierst du dein Array mit einer Länge von 0. Hier kannst du also nichts mehr hineinpacken. Du wirst zwangsläufig beim Einfügen einen IndexOutOfBoundsException bekommen.

3) wenn du append aufrufst, woher weißt du dann, an welcher Position im Array du das neue Element einfügen sollst? Lösung wäre hier (vorausgesetzt es bleibt bei einem Array und nicht einer java.util.ArrayList) eine Klassenvariable, in dem du den aktuellen Index speicherst. Bei jedem Aufruf von append wird an der Index-Stelle eingefügt und anschließend der Index hochgezählt.


----------



## guguli (31. Okt 2013)

Hi,
zu 2): der Konstruktur erzeugt eine Leere List. 
zu 3): wie gesagt ich muss das neue Element am ende einfügen. das soll heissen, ich koppiere die bestehende Liste und dann füge das new Element am ende der list
Bsp:vorhandene Liste: [2,3,1], newElement 4: append(4) --> [2,3,1,4]


----------



## geqoo (31. Okt 2013)

Soso... Im Prinzip hast du den Werkzeugkasten ja schon vor dir liegen, du musst nur noch damit arbeiten.


```
public class ArrayList {

  private int[] data;

  public ArrayList() {
    this.data = new int[0];
  }

  public void append(int newElement) {
    if(newElement < 0){
      return;
    }

    int[] old_array = this.data;
    this.data = new int[old_array.length + 1];

    for(int i = 0; i < old_array.length;i++){
      this.data[i] = old_array[i];
    }

    this.data[old_array.length] = newElement;
  }

}
```

Hinweis: Dass man die Klasse nicht ArrayList nennen sollte, ist mir klar. Ich habe das nur gemacht, weil es hier so gefordert ist.


----------



## Ikaron (2. Nov 2013)

guguli hat gesagt.:


> Ja aber das ist bei mir so vorgegeben. ihc muss das so benutzen .
> 
> ```
> public ArrayList append(int newElement) {
> ...



Nur, um mal ein bisschen deine Verwirrung aufzuklären, da ja hier doch viel durcheinander geworfen wird: Dein Code stimmt soweit FAST, nur kannst du nicht newArray[data.length + 1] = newElement; aufrufen. Wenn das Array die Länge L hat, ist der letzte Index K - 1, also in diesem Fall: newArray[newArray.length - 1] = newElement;
Nun musst du allerdings noch irgendwas mit newArray machen. Um zu wissen, was, brauchen wir die Aufgabenstellung. Denkbar wäre allerdings so etwas: data = newArray;

So weit so gut. Nun zu dem "return null;". Auch hier brauchen wir die Aufgabenstellung. Denkbar wäre hier:
[c]return this;[/c]
[c]return new ArrayList(newArray);[/c]
Je nachdem, was die Methode genau machen soll. => Aufgabenstellung.

Dass "append" static sein soll liegt daran, dass du nicht einfach "append" aufrufen kannst, ohne zu sagen, was denn genau "append" ausführen soll. Wenn man mehrere ArrayList'en hat, weiß das Programm ja dann nicht mehr, welche du meinst, oder allgemein, dass du überhaupt ArrayList'en meinst. Das musst du dem Programm sagen, und zwar über die Punktnotation. Aber dafür brauchen wir erst mal eine Liste, die kriegen wir so:

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

	int[] data = { 2, 3, 5, 7};
	int newElement = 8;

	/*Hier*/ ArrayList list = new ArrayList(data); /*Hier*/
	/*Hier*/ list /*Hier*/.append(newElement);
}
```
So. Ich habe allerdings hier den Verdacht, dass du einen Fehler begehst, was die Umsetzung der Aufgabenstellung angeht. Wenn du nur an "data" anhängen willst, wäre so eine Methode sinnvoller:

```
public int[] append(int[] data, int newElement) {
    	
	int[] newArray = new int[data.length + 1];
	System.arraycopy(data, 0, newArray, 0, data.length);
	newArray[newArray.length - 1] = newElement;
	return newArray;    	 
}
```

Sollten jetzt noch Fragen bestehen, sag einfach bescheid.

PS: Die Verwirrung in dem Thema hier liegt daran, dass java schon eine Klasse "ArrayList" besitzt, diese allerdings auch noch generisch ist, (was das genau ist muss dich denke ich noch nicht interessieren), weshalb jeder hier mit spitzen Klammern <> (teilweise auch noch falsch) rumfuchtelt. Methoden wie "add", "set" und "get" beziehen sich hier meißtens auf eben diese Klasse, java.util.ArrayList und haben somit gar nichts mit deinem Problem zu tun.

PPS: Ich hab ja total die letzten 10 Antworten überlesen... Das meiste wurde schon gesagt... Ich lass es aber trotzdem mal stehen.


----------

