web-dev-qa-db-de.com

Java, Elemente in einem Array verschieben

Ich habe ein Array von Objekten in Java, und ich versuche, ein Element nach oben zu ziehen und den Rest um eins nach unten zu verschieben.

Angenommen, ich habe ein Array der Größe 10 und versuche, das fünfte Element zu ziehen. Das fünfte Element geht in Position 0 und alle Elemente von 0 bis 5 werden um eins nach unten verschoben.

Dieser Algorithmus verschiebt die Elemente nicht richtig:

Object temp = pool[position];

for (int i = 0; i < position; i++) {                
    array[i+1] = array[i];
}
array[0] = temp;

Wie mache ich das richtig?

37
darksky

Angenommen, Ihr Array ist {10,20,30,40,50,60,70,80,90,100}

Was macht Ihre Schleife:

Iteration 1: array [1] = array [0]; {10,10,30,40,50,60,70,80,90,100}

Iteration 2: array [2] = array [1]; {10,10,10,40,50,60,70,80,90,100}

Was Sie tun sollten, ist

Object temp = pool[position];

for (int i = (position - 1); i >= 0; i--) {                
    array[i+1] = array[i];
}

array[0] = temp;
23
Komal Padia

Logisch funktioniert es nicht und Sie sollten Ihre Schleife umkehren:

for (int i = position-1; i >= 0; i--) {                
    array[i+1] = array[i];
}

Alternativ können Sie verwenden

System.arraycopy(array, 0, array, 1, position);
83
Howard

Sie können einfach Collections.rotate(List<?> list, int distance) verwenden.

Verwenden Sie Arrays.asList(array) zum Konvertieren in List 

weitere Informationen unter: https://docs.Oracle.com/javase/7/docs/api/Java/util/Collections.html#rotate(Java.util.List,%20int)

18
Murat Mustafin

Das Manipulieren von Arrays auf diese Weise ist fehleranfällig, wie Sie festgestellt haben. Eine bessere Option kann die Verwendung einer LinkedList in Ihrer Situation sein. Mit einer verknüpften Liste und allen Java-Sammlungen wird die Arrayverwaltung intern verwaltet, sodass Sie sich keine Gedanken darüber machen müssen, ob Elemente verschoben werden. Mit einer LinkedList rufen Sie einfach remove und dann addLast auf und fertig. 

3
Paul Sasik

Nur zur Vollständigkeit: Stream-Lösung seit Java 8.

final String[] shiftedArray = Arrays.stream(array)
        .skip(1)
        .toArray(String[]::new);

Ich glaube, ich habe mich an die System.arraycopy() in Ihrer Situation gehalten. Aber die beste langfristige Lösung könnte sein, alles in unveränderliche Sammlungen ( Guava , Vavr ) umzuwandeln, sofern diese Sammlungen nur von kurzer Dauer sind.

3
Ben

Versuche dies:

Object temp = pool[position];

for (int i = position-1; i >= 0; i--) {                
    array[i+1] = array[i];
}

array[0] = temp;

Schauen Sie hier, um zu sehen, wie es funktioniert: http://www.ideone.com/5JfAg

1
thejh

Eine Linksdrehung in einem Array der Größe n verschiebt jede Elementeinheit des Arrays nach links, überprüfen Sie dies heraus !!!!!!

public class Solution {
    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        String[] nd = scanner.nextLine().split(" ");

        int n = Integer.parseInt(nd[0]);  //no. of elements in the array

        int d = Integer.parseInt(nd[1]);  //number of left rotations

        int[] a = new int[n]; 

      for(int i=0;i<n;i++){
          a[i]=scanner.nextInt();
      }

        Solution s= new Solution();     
//number of left rotations
        for(int j=0;j<d;j++){
              s.rotate(a,n);
        }
   //print the shifted array  
        for(int i:a){System.out.print(i+" ");}
    }

//shift each elements to the left by one 
   public static void rotate(int a[],int n){
            int  temp=a[0];
        for(int i=0;i<n;i++){
            if(i<n-1){a[i]=a[i+1];}
            else{a[i]=temp;}
      }}
}
0
malith vitha
public class Test1 {

    public static void main(String[] args) {

        int[] x = { 1, 2, 3, 4, 5, 6 };
        Test1 test = new Test1();
        x = test.shiftArray(x, 2);
        for (int i = 0; i < x.length; i++) {
            System.out.print(x[i] + " ");
        }
    }

    public int[] pushFirstElementToLast(int[] x, int position) {
        int temp = x[0];
        for (int i = 0; i < x.length - 1; i++) {
            x[i] = x[i + 1];
        }
        x[x.length - 1] = temp;
        return x;
    }

    public int[] shiftArray(int[] x, int position) {
        for (int i = position - 1; i >= 0; i--) {
            x = pushFirstElementToLast(x, position);
        }
        return x;
    }
}
0
Alok Pathak

Eine weitere Variante, wenn Sie die Array-Daten als Java-Liste haben

    listOfStuff.add( 
            0, 
            listOfStuff.remove(listOfStuff.size() - 1) );

Ich teile einfach eine andere Option mit, die ich für dieses Thema getroffen habe, aber ich denke, die Antwort von @Murat Mustafin ist der Weg, um mit einer Liste zu gehen

0
Gene Bo

Anstatt um eine Position zu verschieben, können Sie diese Funktion mit einem solchen Modul allgemeiner machen.

int[] original = { 1, 2, 3, 4, 5, 6 };
int[] reordered = new int[original.length];
int shift = 1;

for(int i=0; i<original.length;i++)
     reordered[i] = original[(shift+i)%original.length];
0
lukaspp
static void pushZerosToEnd(int arr[])
    {   int n = arr.length;
        int count = 0;  // Count of non-zero elements
        // Traverse the array. If element encountered is non-zero, then
        // replace the element at index 'count' with this element
        for (int i = 0; i < n; i++){
            if (arr[i] != 0)`enter code here`
               // arr[count++] = arr[i]; // here count is incremented
                swapNumbers(arr,count++,i);
        }
        for (int j = 0; j < n; j++){
            System.out.print(arr[j]+",");
        }
     }

    public static void swapNumbers(int [] arr, int pos1, int pos2){
        int temp  = arr[pos2];
        arr[pos2] = arr[pos1];
        arr[pos1] = temp;
    }
0
expert

In der ersten Iteration Ihrer Schleife überschreiben Sie den Wert in array[1]. Sie sollten die Angaben in umgekehrter Reihenfolge durchgehen.

0
BenH

Sie können die folgenden Codes verwenden, um nicht zu drehen:

    int []arr = {1,2,3,4,5,6,7,8,9,10,11,12};
            int n = arr.length;
            int d = 3;

Programm zum Verschieben des Arrays der Größe n um d Elemente nach links:

    Input : {1,2,3,4,5,6,7,8,9,10,11,12}
    Output: {4,5,6,7,8,9,10,11,12,10,11,12}

        public void shiftLeft(int []arr,int d,int n) {
            for(int i=0;i<n-d;i++) {
                arr[i] = arr[i+d];
            }
        }

Programm zum Verschieben des Arrays der Größe n um d Elemente nach rechts:

    Input : {1,2,3,4,5,6,7,8,9,10,11,12}
    Output: {1,2,3,1,2,3,4,5,6,7,8,9}

        public void shiftRight(int []arr,int d,int n) {

            for(int i=n-1;i>=d;i--) {
                arr[i] = arr[i-d];
            }
        }
0
Swapnil sharma