Verschieben eines Arrays aus Objekten

Rol

Aktives Mitglied
Hallo,

ich erzeuge ein Array aus objekten:
Java:
public Candle myArray[] = new MyObject[100l];
...
for (int i = 0; i < 100; i++) {
      myArray[i] = new MyObject();
}

Nun möchte ich die Objekte alle um eine Stelle nach links schieben, das 0. Element soll dabei vom 1. überschrieben werden. Ich mache das so:
Java:
for (int i = 0; i < 99; i++) {
       myArray[i] = myArray[i + 1];
}

Danach haben manche Objekte im Array falsche Werte.
MfG
Rol
 
Ich glaube, das liegt daran, dass im Array nur die Speicheradresse des Objekts und nicht das Objekt selbst steht; leider kann ich jetzt auch nicht sagen, wie ich an Deiner Stelle anders programmieren würde.
 
was heißt denn "manche"? Meinst du zufällig die letzten beiden Werte, die dann identisch sind? Du kannst auch sowas machen:
Java:
System.arraycopy(myArray, 1, myArray, 0, myArray.length-1);
 
Danach haben manche Objekte im Array falsche Werte.
Kann ich mir nicht vorstellen... was meinst du mit falschen werten...



Java:
import java.util.Arrays;

public class Tester {
	static Container myArray[] = new Container[100];
	public static void main(String[] args) {
		
		
		
		for (int i = 0; i < 100; i++) {
		      myArray[i] = new Container(i);
		}
		
		System.out.println(Arrays.toString(myArray));
		
		for (int i = 0; i < 99; i++) {
		       myArray[i] = myArray[i + 1];
		}
		System.out.println(Arrays.toString(myArray));
	}
	
}
	public class Container {
		private int value;

		public Container(int value) {
			this.value = value;
		}
		
		public String toString(){
			return value+" ";
		}
	}
passt genau...
 
Wenn ich es so mache:
Java:
       for (int i = 0; i < 99; i++) {
               myArray[i].eigenschaft1 = myArray[i + 1].eigenschaft1;
               myArray[i].eigenschaft2 = myArray[i + 1].eigenschaft2;
...
        }

funktionier es wie gewünscht. Bei:
Java:
               myArray[i].eigenschaft1 = myArray[i + 1].eigenschaft1;

haben eigenschaft1, eigenschaft2 usw. nach dem Verschieben nicht gewünschten Werte. Nach n-malgen Verschieben haben alle n-letzten Objelte die gleichen Eigenschfaten und ändern sich beim Ändern der Eigenschaften des letzten Objektes dynamisch mit.

Das wird wohl daran liegen, dass mein Array nicht die Objekte sondern nur die Referenzen auf die Objekte enthält und nur die werden beimverschieben kopiert.

Wie verschiebe ich aber denn nun die tatsächlichen Objekte im Array und nicht die Referenzen?

MfG
Rol
 
Wie verschiebe ich aber denn nun die tatsächlichen Objekte im Array und nicht die Referenzen?
Die Frage ist so falsch 😉

In Java arbeiten wir immer nur mit Referenzen, wo die Objekte sind kann dir egal sein, diese stecken nie in einem Array/Collection.

Ansonsten: wäre eine List (zB. LinkedList) nicht besser geeignet?
 
Ein array passt für den Rest des Problems sehr gut. Ich muss immer wieder auf das genau n-te, m-te uws. Element zugreifen. Ich glaube eine Liste ist da nicht so gut.

Gibt es also nur die Möglichkeit über:
Java:
       for (int i = 0; i < 99; i++) {
               myArray[i].eigenschaft1 = myArray[i + 1].eigenschaft1;
               myArray[i].eigenschaft2 = myArray[i + 1].eigenschaft2;
...
        }

? Das funktioniert gut, ist aber nicht gerade "elegant", insbesondere wenn die Objektklasse mal andere oder mehr Eigenschaften bekommen soll.
 
In einer Liste könntest du einfach das 0te Element löschen und die anderen würden automatisch nachrutschen. Aber auch in einer Liste kannst du auf das x-te Element zugreifen. Dafür ist eine Liste auch da
 
Schreibe eine neue Methode:

Java:
class Candle 
{
   ...
   int eigenschaft1;
   int eigenschaft2;
....
   

   protected void copyFromOtheCandleObject( Candle obj2 )
   {
       eigenschaft1 = ob2.eigenschaft1;
       eigenschaft2 = ob2.eigenschaft2;
      ...
 
   }
}


Java:
for (int i = 0; i < 99; i++) 
{
               myArray[i].copyFromOtherObject(myArray[i + 1])
}
 
Nach dem n-ten verschieben enthalten die n-letzten (rechtesten) Elemente des Arrays alle eine Referenz auf das gleiche Objekt. Ich habe jetzt eine Möglichkeit gefunden:

Java:
System.arraycopy(myArray, 1, myArray, 0, myArray.length-1);
myArray[myArray.length-1] = new MyObject();
Es wird also rechts immer ein neues Objekt "überschrieben".

Frage: Muss / sollt ich mich um die "links herausfallenden" Objekte kümmern oder kann man das getrost der Garbage collection überlassen?
 
Nach n-malgen Verschieben haben alle n-letzten Objelte die gleichen Eigenschfaten und ändern sich beim Ändern der Eigenschaften des letzten Objektes dynamisch mit.

du hast folgendes Array:

Code:
Objekt1
Objekt2
Objekt3
Objekt4
Objekt5

Jetzt verschiebst du diese mit deinem Algo:

Code:
Objekt2
Objekt3
Objekt4
Objekt5
Objekt5

Jetzt verschiebst du diese nochmal mit dem Algo:

Code:
Objekt3
Objekt4
Objekt5
Objekt5
Objekt5

Jetzt änderst du Objekt5 an Index 4:

Code:
Objekt3
Objekt4
Objekt5 - geändert
Objekt5 - geändert
Objekt5 - geändert

Nachdem Index 2,3 und 4 alle auf ein Objekt referenzieren änderst du damit alle auf einmal.

Ich frag mich gerade noch nach dem Sinn 🙂. Was willst du denn überhaupt machen? Du willst einfach das erste Objekt löschen? Dann nimm eine ArrayList oder erzeuge ein neues Array mit einem Feld weniger als das Ursprungsarray (ersteres ist allerdings besser)
 
Nach dem Code meines letzten Postings habe ich:

Am Anfang folgendes Array:
Java:
Objekt1
Objekt2
Objekt3
Objekt4
Objekt5

Dann verschieben ich einmal mit:
Java:
System.arraycopy(myArray, 1, myArray, 0, myArray.length-1);

und hane dann folgendes Array:
Java:
Objekt2
Objekt3
Objekt4
Objekt5
Objekt5

Dann mache ich:
Java:
myArray[myArray.length-1] = new MyObject();

uns habe:
Java:
Objekt2
Objekt3
Objekt4
Objekt5
Objekt5
Objekt6

Das ist genau dass, was ich wollte. Meine Frage war nun nur noch, ob ich das Objekt1 danach expliziet Löschen soll/kann/muss. Ich weiß, dass die garbage Collektion so etwas macht, aber nicht wie oft, sicher usw.
 
Nach dem Code meines letzten Postings habe ich:

Am Anfang folgendes Array:
Java:
Objekt1
Objekt2
Objekt3
Objekt4
Objekt5

Dann verschieben ich einmal mit:
Java:
System.arraycopy(myArray, 1, myArray, 0, myArray.length-1);

und hane dann folgendes Array:
Java:
Objekt2
Objekt3
Objekt4
Objekt5
Objekt5

Dann mache ich:
Java:
myArray[myArray.length-1] = new MyObject();

und du hast:

Code:
Objekt2
Objekt3
Objekt4
[B]Objekt5[/B]
Objekt6

habs nicht getestet aber bin mir da ziemlich sicher. wenn du dynamik willst nimm eine liste!

Das ist genau dass, was ich wollte. Meine Frage war nun nur noch, ob ich das Objekt1 danach expliziet Löschen soll/kann/muss. Ich weiß, dass die garbage Collektion so etwas macht, aber nicht wie oft, sicher usw.

musst und kannst du nicht. auf das objekt besteht keine referenz mehr. das wird vom gc automatisch bei bedarf platt gemacht

edit beachten. c&p fehler unterlaufen 😀
 
Zuletzt bearbeitet:
und du hast:

Java:
Objekt2
Objekt3
Objekt4
Objekt6
Objekt6

habs nicht getestet aber bin mir da ziemlich sicher. wenn du dynamik willst nimm eine liste!

Ne, habst getestet: Nur das letzte Objekt wird überschrieben, Objekt5 bleibt.

musst und kannst du nicht. auf das objekt besteht keine referenz mehr. das wird vom gc automatisch bei bedarf platt gemacht

Danke.
 
Weil hinzufügen geht bei Arrays nicht ohne weiteres.

Ich will auch nichts hinzufügen. Die Anzahl der Abjekte / Arrayfelder soll immer gleich belieben. Deshalb scheint mit ein Array auch nicht unpassend.

Ich will nur den Inhalt ab und zu um einen Platz nach links schieben, so dass das linke (0-te) Element "rausfällt" und rechst ein neues / leeres entsteht.
 
ok dann passt das ja. dann war halt nur deine aussage

uns habe:
Java:
Objekt2
Objekt3
Objekt4
Objekt5
Objekt5
Objekt6

etwas verwirrend.

nichts desto trotz wäre das wahrscheinlich mit einer liste schöner gelöst aber wenn das erst mal so deinen ansprüchen entspricht wäre das ja erledigt 😉
 
Zuletzt bearbeitet:

Zurück
Oben