Java: Add-Funktion selber schreiben?
Hallo zusammen.
Ich versuche zurzeit die Arraylist selber zu schreiben und komme bei der Add-Funktion nicht weiter, da mir diese eine Array-OutOfBound-Exception schmeißt.
Was kann ich tun?
Hier der Code:
public class MyArrayList<E> implements MyArrayListInterface<E> {
/**
* Fields
*/
private E[] list;
private int size, capacity, increment, l;
private Array String;
/**
* Methods
*
* @param c
* @param inc
*/
@SuppressWarnings("unchecked")
public MyArrayList(int c, int inc) {
if (c > 0) {
this.capacity = c;
}
else {
this.capacity = 10;
}
list = (E[]) new Object[c];
size = 0;
if (inc > 0) {
this.increment = inc;
}
else {
this.increment = 1;
}
}
@Override
@SuppressWarnings("unchecked")
public void add(E e) {
for (int i = 0; i < list.length; i++) {
if (list[i] == null) {
list[i] = e;
}
else {
E[] list1 = (E[]) new Object[capacity + increment];
System.arraycopy(list, 0, list1, 0, size);
list1[i] = e;
}
size++;
System.out.println(Arrays.toString(list));
}
}
1 Antwort
Warum iterierst du jedesmal das komplette Array ab, wenn du etwas hinzufügst? Vor allem hast du mit "size" doch eine Variable die genau dazu dienen kann.
Dann ergibt deine if-Abfrage aus meiner Sicht wenig Sinn. Beim Einfügen des ersten Wertes werden alle Zellen des Arrays auf das gleiche Element gesetzt. Beim zweiten Durchgang werden zig Kopien erstellt (jeder Schleifendurchgang eine Kopie), da jede Zelle != 0/NULL ist. Allerdings speicherst du das neu erstellte Array auch nicht.
Beim zweiten Durchgang während des zweiten Durchganges bricht es dann ab, da die aktuelle Größe des Arrays (list) noch dem Ursprungswert (z.B. 10) entspricht, die size aber bereits 11 hat. Er versucht jetzt also ein Array der Größe 10 von 0-10 (11 Werte) zu kopieren.
Guck es dir am besten mal in einem Debugger an.
Ein kurz zusammengeworfener Vorschlag:
public void add(E e) {
if(size<list.length){
list[size] = e;
}
else{
E[] newList = (E[]) new Object[capacity + increment];
System.arraycopy(list,0,newList,0,size-1);
newList[size] = e;
capacity+=increment;
list = newList;
}
size++;
}
}
