# Elemente in einem Array nach 'oben' verschieben



## wbdo (11. Jun 2012)

Hallo,

da ich im Wintersemester mit dem Studium anfange, beschäftige ich mich schon mal mit Java. Ich habe dazu einige Aufgaben erhalten. Da ich allerdings noch nicht ganz fit bin, habe ich ein kleines Problem beim verschieben von Elementen in Feldern. 

Ich möchte alle Elemente in einem array eine Position so zu sagen noch oben verschieben. Also dass das Element an Position a_ nach dem Verschieben an a[i+1] ist. Das letzte Element würde dann an den Anfang des array rutschen. 

Ich hab das Problem mit einem Hilfsarray bereits gelöst, möchte es jetzt aber ohne dieses tun. 

Jetzt die Frage, kann ich das Problem so lösen, dass ich das Element an Stelle i einer Variable x zuweise und das x dann an Stelle i+1 eingefügt wird? 



		Java:In die Zwischenablage kopieren


for(int i = 0; i < a.length; i++){
		int x = a[i];
		a[i+1] = x;
	}

_


----------



## SlaterB (11. Jun 2012)

was sollte das bringen? du könntest doch gleich 
a[i+1] = a_;
ausführen, x hat dabei keine Funktion,

sinnvoll wäre aber, das nächste Element in einer Variablen bis zum nächsten Schleifendurchlauf zu speichern, um es zu retten,
bevor dieser Speicherplatz mit dem aktuellen/ vorherigen/ was auch immer Element überschrieben wird, 
welches aber nicht in diesem Moment aus dem Array gelesen werden kann, 
denn dessen Platz wurde ja schon überschrieben, das Element ist genau das zuvor gemerkte,

kannst du mit diesen Gedanken schon zu irgendwas kommen?
die Liste rückwärts zu durchlaufen wäre natürlich unendlich leichter_


----------



## wbdo (11. Jun 2012)

SlaterB hat gesagt.:


> was sollte das bringen? du könntest doch gleich
> a[i+1] = a_;
> ausführen, x hat dabei keine Funktion,
> 
> ...


_

wenn ich es richtig verstanden habe, soll das Element an a[i+1] gespeichert werden, bevor es mit a überschrieben wird? Also quasi dass das i+1 gerettet wird, damit es dann im nächsten Durchlauf wieder weiter gespeichert werden kann? 

Denn das, war so zu sagen meine erste Idee, deshalb das x. Hatte da wohl einen kleinen Denkfehler.



SlaterB hat gesagt.:



			die Liste rückwärts zu durchlaufen wäre natürlich unendlich leichter
		
Zum Vergrößern anklicken....


ok, also die Elemente von hinten nach vorne einfügen mit einer for schleife die rückwärts läuft? und i muss dann immer kleiner werden (i--)?



		Java:In die Zwischenablage kopieren


for(int i = a.length-1; i > 0; i--){
		int x = a[i];
		a[i] = a[i-1];
		a[i-1] = x;
	}	i--;

_


----------



## SlaterB (11. Jun 2012)

> Hatte da wohl einen kleinen Denkfehler.

und jetzt im Text immer noch, ist wirklich nicht ganz leicht, ruhig bisschen ausprobieren, auch auf Papier, 
wo wird wann welcher Wert gesetzt, wo wurde der gemerkt?

-------

besser aber abwärts falls erlaubt, dann ist es simpel,
im Moment hast du es falsch, du vertauschst ja Elemente, 
es ist dann wirklich nur eine Zeile, 
> a_ = a[i-1];
oder so, kein x, 
i--; nach der Schleife sieht auch recht verrückt aus

das letzte Element vor der Schleife merken und am Ende nach vorne setzen_


----------



## Marco13 (11. Jun 2012)

Sowas wie

```
int last = a[a.length-1];
System.arraycopy(a, 0, a, 1, a.length-1);
a[0] = last;
```
dürfte auch gehen und könnte schneller sein. Kurz und elegant ist es auf jeden Fall. (FALLS man die Operation an sich elegant findet - je nachdem, wofür das gebraucht wäre, könnte da auch sowas wie LinkedList sinnvoll sein, aber ... das muss man sich überlegen...)


----------



## AquaBall (12. Jun 2012)

Ja, aber als Anfänger will er ja Arrays udn Schleifen und ... kennenlernen.
Da ist arraycopy nicht der hilfreichste Ansatz.


----------



## bERt0r (12. Jun 2012)

Stell dir vor du hast einen Kasten mit n Schubladen. Wie stellst du's an, wenn du alle Schubladen um eine Stelle nach unten verlegen willst, und die letzte dann eben ganz oben rein? Spiel das mal durch und schreib auf wie du vorgehst.


----------



## wbdo (12. Jun 2012)

habe es mal auf Papier versucht. Aber selbst wenn ich es von hinten versuche, muss ich doch das letzte Element merken. Ansonsten wird es doch vom Vorhänger überschrieben. 

Zuerst das Element an Stelle a.length-1 speichern

dann kann ich ja von hinten nach vorne a[i-1] an a_ zuweisen. 

abschließend dann a[0] = Element an a.length-1; 



		Java:In die Zwischenablage kopieren


int x = a[a.length-1];
		for(int i = a.length-1; i > 0; i--)
			a[i] = a[i-1];
			a[0] = x; 
		return a;

_


----------



## SlaterB (12. Jun 2012)

> Aber 
kein aber, habe ich zumindest doch auch schon geschrieben,
paar Zeilen extra drumherum sind ja auch zu verkraften,
das muss so oder so sein als abweichendes Verhalten


----------



## hüteüberhüte (12. Jun 2012)

wbdo hat gesagt.:


> habe es mal auf Papier versucht. Aber selbst wenn ich es von hinten versuche, muss ich doch das letzte Element merken. Ansonsten wird es doch vom Vorhänger überschrieben.



Ja, letztes Element merken. Ansonsten stehen dann aber immer zwei gleiche Elemente nebeneinander:


```
int[] array = {1, 2, 3, 4, 5};
        int j = array[array.length - 1];

        for (int i = array.length - 1; i > 0; i--) {
            array[i] = array[i - 1];
            // zwei gleiche Elemente nebeneinander
        }

        array[0] = j;
```

Wenn du das Array von vorne durchläufst, wird ja ein noch zu verschiebendes Element überschrieben. Dieses müsstest du dir dann merken.

Einfach etwas mit Schleifen experimentieren...


----------

