Java, verschuivende elementen in een array

Ik heb een reeks objecten in Java en ik probeer één element naar boven te trekken en de rest één naar beneden te schuiven.

Stel dat ik een array van grootte 10 heb en ik probeer het vijfde element te trekken. Het vijfde element gaat naar positie 0en alle elementen van 0 tot 5 worden één naar beneden verschoven.

Dit algoritme verschuift de elementen niet correct:

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

Hoe doe ik het correct?


Antwoord 1, autoriteit 100%

Ervan uitgaande dat uw array {10,20,30,40,50,60,70,80,90,100} is

Wat je loop doet is:

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

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

Wat u zou moeten doen is

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

Antwoord 2, autoriteit 98%

Logischerwijs werkt het niet en moet u uw lus omdraaien:

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

Als alternatief kunt u

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

Antwoord 3, autoriteit 84%

Je kunt gewoon Collections.rotate(List<?> list, int distance)

gebruiken

Gebruik Arrays.asList(array)om te converteren naar List

meer info op: https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#rotate(java.util.List,%20int)


Antwoord 4, autoriteit 10%

In plaats van één positie te verschuiven, kun je deze functie algemener maken met een module zoals deze.

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];

Antwoord 5, autoriteit 10%

Voor de volledigheid: Stream-oplossing sinds Java 8.

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

Ik denk dat ik in jouw situatie bij de System.arraycopy()gebleven ben. Maar de beste oplossing voor de lange termijn zou kunnen zijn om alles om te zetten naar onveranderlijke verzamelingen (Guava, Vavr), zolang die verzamelingen maar van korte duur zijn.


Antwoord 6, autoriteit 6%

Manipulerende arrays op deze manier is foutgevoelig, zoals u hebt ontdekt. Een betere optie kan zijn om een ​​LinkedList te gebruiken in jouw situatie. Met een gekoppelde lijst, en alle Java-collecties, wordt Array Management intern gehandeld, zodat u zich geen zorgen hoeft te maken over het verplaatsen van elementen rondom. Met een LinkedList bel je gewoon removeen dan addLasten het is klaar.


Antwoord 7, Autoriteit 3%

Probeer dit:

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

Kijk hier om het te zien werken: http://www.ideone.com/5jfag


Antwoord 8

In de eerste iteratie van uw lus overschrijft u de waarde in array[1]. U moet de aanklachten in de omgekeerde volgorde doorlopen.


Antwoord 9

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;
    }

Antwoord 10

Nog een variatie als u de arraygegevens als een Java-lijst

hebt

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

Delen gewoon een andere optie die ik hiervoor liep, maar ik denk het antwoord van @murat Mustafin is de weg naar Ga met een lijst


Antwoord 11

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;
    }
}

Antwoord 12

Een linker rotatiebewerking op een reeks van grootte n verschuift elk van de elementeneenheid van de array naar links, kijk dit uit !!!!!!

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;}
      }}
}

Antwoord 13

U kunt de onderstaande codes gebruiken voor schakelen zonder draaien:

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

Programma voor het verschuiven van de array van grootte nmet delementen naar 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];
            }
        }

Programma voor het verschuiven van de array van grootte nmet delementen naar 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];
            }
        }

Antwoord 14

import java.util.Scanner;
public class Shift {
    public static void main(String[] args) {
        Scanner input = new Scanner (System.in);
        int array[] = new int [5];
        int array1[] = new int [5];
        int i, temp;
        for (i=0; i<5; i++) {
            System.out.printf("Enter array[%d]: \n", i);
            array[i] = input.nextInt(); //Taking input in the array
        }
        System.out.println("\nEntered datas are: \n");
        for (i=0; i<5; i++) {
            System.out.printf("array[%d] = %d\n", i, array[i]); //This will show the data you entered (Not the shifting one)
        }
        temp = array[4]; //We declared the variable "temp" and put the last number of the array there...
        System.out.println("\nAfter Shifting: \n");
        for(i=3; i>=0; i--) {
            array1[i+1] = array[i]; //New array is "array1" & Old array is "array". When array[4] then the value of array[3] will be assigned in it and this goes on..
            array1[0] = temp; //Finally the value of last array which was assigned in temp goes to the first of the new array
        }
        for (i=0; i<5; i++) {
            System.out.printf("array[%d] = %d\n", i, array1[i]);
        }
        input.close();
    }
}

Antwoord 15

Schrijf een Java-programma om een ​​reeks van 20 gehele getallen te maken en implementeer vervolgens het proces van het verschuiven van de array naar rechts voor twee elementen.

public class NewClass3 {
     public static void main (String args[]){
     int a [] = {1,2,};
     int temp ;
     for(int i = 0; i<a.length -1; i++){
         temp = a[i];
         a[i] = a[i+1];
         a[i+1] = temp;
     }
     for(int p : a)
     System.out.print(p);
     }
}

Other episodes