# Elemente eines Arrays verschieben



## Mudassar (29. Dez 2015)

Hallo,

Ich bin sehr neu beim Programmieren und habe echt sehr viele Probleme, ich bin gezwungen es zu lernen, da es mein Leistungskurs ist. 

Ich möchte Elemente im Array verschieben,:

char[] A;
        A = new char[6];
        A[0] = 'a';
        A[1] = 'b';
        A[2] = 'c';
        A[3] = 'd';
        A[4] = 'e';
        A[5] = 'f';

sodass, bei der A[0] nichts steht also es soll blank sein und sonst soll alles um eins verschoben werden. 

Ich bedanke mich vorraus


----------



## MWin123 (29. Dez 2015)

Was ist deine Frage?


----------



## Mudassar (29. Dez 2015)

Also ich möchte wissen wie ich alle Elemente um 1 Stelle verschiebe.


----------



## Mudassar (29. Dez 2015)

MWin123 hat gesagt.:


> Was ist deine Frage?


MWin123 ich habs aber trotzdem Danke!!!


----------



## 3njoyeD (30. Dez 2015)

Auch wenn du deine Lösung schon gefunden hast, so steht in diesem Thema noch keine & ich wollte mich selbst an der Aufgabe probieren. Dein Ziel war es nicht die Ausgaben um eins zu verschieben, sondern die einzelnen Felder im Array selbst.

In meiner Lösung kannst du beliebig viele character Werte hinzufügen, das neue Array verschiebt alles um 1 Feld nach rechts:


```
char[] A;
        A = new char[8];
        A[0] = 'a';
        A[1] = 'b';
        A[2] = 'c';
        A[3] = 'd';
        A[4] = 'e';
        A[5] = 'f';
        A[6] = 'g';
        A[7] = 'h';
      
        System.out.println("Vorher: ");
        for (int i = 0; i < A.length; i++) {
           System.out.println("A -- Arrayfeld:  " + i + " Arrayinhalt: " + A[i] );
        }

        char[] X;
        X = new char [A.length+1];
      
        System.out.println("Nachher: ");
        for (int i = 0; i < X.length; i++) {
            if (A.length != i){
                char zwischenSpeicher = A[i];
                X[i+1] = zwischenSpeicher;
                }    else if (i == 0) {
                    X[0] = ' ';
                    }
            System.out.println("X -- Arrayfeld:  " + i + " Arrayinhalt: " + X[i] );
          
        }
```


----------



## Tarrew (30. Dez 2015)

@3njoyeD Deine Lösung ist richtig und funktioniert gut, aber noch einfacher ist es wenn man das Array von hinten durchläuft. Dann kann man sich den Zwischenspeicher etc sparen.


```
char[] array = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
        for (int i = array.length - 1; i > 0; i--) {
            array[i] = array[i - 1];
        }
        array[0] = ' ';

        System.out.println(array);
```


----------



## 3njoyeD (30. Dez 2015)

Hab deinen Code ausgeführt & gesehen, dass dabei das letzte Feld "verschwindet"
Kommt darauf an, ob man damit zufrieden ist, oder ob man den gesamten Inhalt verschieben will.
Wenn ja, dann kommt man wohl ohne ein 2tes Array & Zwischenspeicher nicht drumrum.


----------



## Tarrew (30. Dez 2015)

Das stimmt. War davon ausgegangen, dass man im gleichen Array verschieben möchte.
Wenn man alle Buchstaben verschieben möchte ohne das welche rausfallen braucht man natürlich ein zweites größeres Array. Den Zwischenspeicher braucht man aber tdz. nicht: 

```
char[] array = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
        char[] shifted=new char[array.length+1];
        for (int i = shifted.length - 1; i > 0; i--) {
            shifted[i] = array[i - 1];
        }
        shifted[0] = ' ';
        System.out.println(shifted);
```


----------



## Flown (31. Dez 2015)

So macht man das händisch und wenn man es noch ein wenig mehr vereinfacht hätte, nimmt man `System::arraycopy`:

```
import java.util.Arrays;

public class Test {
	
	public static void main(String... args) {
		char[] array = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' };
		rightShift(array, ' ');
		System.out.println(Arrays.toString(array));
	}
	
	public static void rightShift(char[] array, char emptyChar) {
		if (array != null && array.length > 0) {
			System.arraycopy(array, 0, array, 1, array.length - 1);
			array[0] = emptyChar;
		}
	}
}
```


----------



## 3njoyeD (31. Dez 2015)

Hab den Code eingetippt & ausführen lassen:
In der Methode rightShift wird das array übergeben, welches verschoben werden soll & einmal der character mit leerem Inhalt.

Dann wird in der if-Abfrage geprüft ob sich Inhalt im array befindet & das array mind. ein Element besitzt. Wenn die Bedingung erfüllt ist dann kopiere dieses Array mit folgenden Parametern:

Quelle: array
Startposition 0
Ziel auch array
Zielposition 1
Zielposition Länge des arrays -1
Hier ist es dann das gleiche Problem wie bei Tarrews erster Lösung:
Das letzte Feld wird abgetrennt.



Tarrew hat gesagt.:


> @3njoyeD Deine Lösung ist richtig und funktioniert gut, aber noch einfacher ist es wenn man das Array von hinten durchläuft. Dann kann man sich den Zwischenspeicher etc sparen.
> 
> 
> ```
> ...



Also Möglichkeiten gibt es nun genug um ein Array zu verschieben.

Mit arraycopy wollte ich auch anfangs code schreiben, aber ich kam mit den Parametern nicht zurecht.
Jetzt geht mir diesbezüglich auch ein kleines Licht auf.


----------

