# Einen Eintrag im Array löschen?



## Servo Herko (28. Nov 2013)

Wie kann ich einen Eintrag simpel löschen von soeinem Array.
Gibt es sowas wie 
	
	
	
	





```
a.remove(index);
```
 ?

Oder wie geht sowas, es sollte nicht so großer Quellcode raus kommen!

Vielen Dank im Vorraus


----------



## njans (28. Nov 2013)

Arrays haben eine fixe Größe. Du kannst höchstens dir eine Methode schreiben, die Werte des Arrays in ein neues kopiert und dabei den einen Wert nicht mitnimmt.


----------



## BuddaKaeks (28. Nov 2013)

```
String [] strings = new String[10];


strings[4] = "Maus"; //Array-Eement setzen
strings[4] = null; //Array-Element löschen
```

Ich glaube, was du suchst ist eine von der Lenge variable Liste,

schau dir mal das Interafce List<E> und dessen Implementierungen ArrayList<E> und LinkedList<E> an.


----------



## Servo Herko (28. Nov 2013)

Ich versuch die ganze Zeit soeine Methode zu erstellen, aber hier das Problem.


```
package home;

public class List<O> {
	private O[] os;
	private int by = 0;
	public List(O[] os) {
		this.os = os;
	}
	public void add(O o) {
		os[by] = o;by++;
	}
	public O get(int index) {
		return os[index];
	}
	public int getSize() {
		return os.length;
	}
	public void remove(int index) {
		/* Ich habe das Array im cunstructor einfach nur kopiert und es so erstellt,
		 *  das heisst die Größe war schon fest gelegt.
		 *  Doch ich brauche ja jetzt ein ganz neues Array, das dann 1 Eintrag kleiner 
		 *  ist als das original...
		 *  */
	}
}
```

Am besten wäre es halt mit O[] cos = new O[(os.length-1)];
Um alles Weitere kann ich mich später kümmern, also das mit dem rauschneiden...


----------



## rme (28. Nov 2013)

Was spricht denn dagegen, es mit deinem Ansatz O[] cos = new O[(os.length-1)]; zu probieren?


----------



## Servo Herko (28. Nov 2013)

Das funktioniert nicht, damit meinte ich eig "so etwas", da ich keine Ahnung habe, wie ich von meinem generics einen Array mache...


----------



## rme (28. Nov 2013)

Oh, du verwendest Generics - Sorry, übersehen. Man kann kein Array von Generics zur Laufzeit erstellen, da die Informationen über die Typen nur zur Compile-Zeit bekannt sind.

Lösung: Speicher die Daten intern als Object[]-Array. Da deine Add-Methode sich darum kümmert, dass nur Elemente vom Typ O eingefügt werden, kannst du beim Auslesen auf O casten.


----------



## Servo Herko (28. Nov 2013)

THx, ich habe noch nie mit Object gearbeitet, aber es hat funktioniert.
Ich dachte immer man kann solche sachen nur in generics rein schreiben...

Hier der remove code:


```
public void remove(int index) {
	    Object[] o = new Object[os.length-1];
	    
	    int f = 0;
	    for(int i = 0; i < os.length-1; i++) {
	    	if(i == index) {
	    		f++;
	    	}
                 o[i] = os[i+f];
	    }
	    os = (O[]) o;
	}
```


----------



## rme (28. Nov 2013)

Evtl. interessiert dich dann dieser Thread 

http://www.java-forum.org/java-basics-anfaenger-themen/156232-unterschied-objekte.html


----------



## BuddaKaeks (3. Dez 2013)

[OT]Generisches Array erzeugen:
[/OT]

```
public static <T> T[] getNewArray(Class<T> clazz, int length){
    return (T[]) Array.newInstance(clazz, length);
}
```


----------



## Chloroplast (4. Dez 2013)

tipp: ist jetzt vllt nicht wichtig, aber verwende, wenn du nur eine variable um 1 erhöhen willst statt f++ einfach ++f. hat was mit der rückgabe zu tun, f++ speichert den anfangswert kurzfristig


----------



## rme (4. Dez 2013)

Wenn die Anwendung "f++" oder "++f" nicht Teil eines Ausdrucks ist, sind die Verhaltensweisen auf Bytecode-Ebene völlig identisch, da es dort keinen Unterschied gibt. Es gibt einfach nur eine "increment local variable"-Anweisung. Falls das Inkrement in einem Ausdruck vorkommt, generiert der Compiler den nötigen Bytecode, um die Variable ggf. vorher zu sichern und nach dem Ausdruck zu inkrementieren, wie du oben beschrieben hast. Aber das ist hier und allgemein nicht oft der Fall.


----------

