2014-09-25 4 views
0

Я пишу код, который будет смещать все элементы массива назад, и переместить последний элемент в начало массива.Смещение всех элементов массива обратно в Java

Я довольно много хочу, чтобы моя программа, чтобы сделать это:

int[] array = new int[] {1, 2, 3}; 
// do something such that array will become {3, 1, 2} 

Мой код выглядит следующим образом:

int[] array = new int[3]; 


for(int i = 0; i < array.length; i++) 
{ 
    array[0] = 1; 
    array[1] = 2; 
    array[2] = 3; 
    int last = array[array.length-1]; 
    array[i] = array[i+1]; 
    array[0] = last; 

    System.out.println(array[i]); 
} 

Я думал, что добавление 1 к «я» для массива и хранения последний элемент массива в «последнем» и присвоение ему массиву [0] выполнит трюк, но я просто получаю {3, 3} в выводе с помощью «java.lang.ArrayIndexOutOfBoundsException: 3.».

+0

Возможно, вы имели в виду shuffle или shift? –

+0

Почему вы назначаете первые три индекса в каждом цикле? – Christoffer

+0

Вам нужно продумать, что происходит внутри цикла и какие вещи происходят до или после него. – khelwood

ответ

1

Вы могли бы попробовать что-то вроде этого:

int[] originalArray = ... 
int[] shiftedArray = new int[originalArray.length]; 

System.arraycopy(originalArray, 0, shiftedArray, 1, originalArray.length - 1); 
shiftedArray[0] = originalArray[originalArray.length - 1]; 

EDIT Как было предложено, только один массив на самом деле нужен

int[] originalArray = ... 
int lastItem = originalArray[originalArray.length - 1]; 

System.arraycopy(originalArray, 0, originalArray, 1, originalArray.length - 1); 
originalArray [0] = lastItem; 
+0

Я отредактировал ваш ответ, чтобы исправить имя метода. Имя метода не является верблюжьим. – azurefrog

+0

Вам даже не нужно копировать массив (вы можете иметь массивы 'src' и' dest' в соответствии с документами). – vanza

+0

Не думал об этом, это хорошее улучшение. На этом я обновил свой ответ. – Claudio

5

Если вы действительно хотите повернуть его (звучит немного похоже на него). Использование Collections.rotate():

Collections.rotate(Arrays.asList(array), 1); 

Где 1 это число шагов (расстояние)

Если вы не хотите, чтобы преобразовать массив в список вы могли бы сделать его вручную с помощью простых методов, как это (например)

Going слева

void rotateArrayLeftByOne(int array[]) 
{ 
    // get last index of array 
    int lastIndex = array.length - 1; 
    // save first element 
    int oldFirst = array[0]; 

    // copy the elements from right to left 
    for (int i = 0; i < lastIndex; i++) 
     array[i] = array[i + 1]; 

    // put the first element last 
    array[lastIndex] = oldFirst; 
} 

и ладится:

void rotateArrayRightByOne(int array[]) 
{ 
    // get last index of array 
    int lastIndex = array.length - 1; 
    // save last element 
    int oldLast = array[lastIndex]; 

    // copy the elements from left to right 
    for (int i = lastIndex; i != 0; i--) 
     array[i] = array[i - 1]; 

    // put the last element first 
    array[0] = oldLast; 
} 
+1

Я не знал об этом методе вращения, хорошо и просто +1 –

+1

Не знал об этом методе. Но чтобы избежать преобразования в список, довольно сложно реализовать с помощью 'System.arraycopy()', особенно для одного шага. – vanza

+2

Если вы действительно попытаетесь запустить это, это не сработает. Вы вращаете созданный «List», но не оригинальный массив. – azurefrog

0

Вы пытаясь получить доступ к индексу, который не существует в вашем массиве. Размер вашего массива равен 3, поэтому 2 - последний индекс. Кроме того, вы инициализируете и печатаете в цикле for. Вы должны делать это вне цикла.

int[] array = new int[3]; 

array[0] = 1; 
array[1] = 2; 
array[2] = 3; 

for(int i = 0, previous_value = array[array.length]; i < array.length; i++) 
{ 
    int prev = array[i]; 
    array[i] = previous_value; 
    previous_value = prev; 
} 

for(int i = 0; i < array.length; i++) 
{ 
System.out.println(array[i]); 
} 
0

С пространством O (1) и временем O (n).

int[] array = new int[3]; 

for(int i = 0; i < array.length; i++) array[i] = i; 

int temp = array[array.length-1]; 

for(int i = array.length-1; i > 0; i--) array[i] = array[i-1]; 

array[0] = temp; 
+0

Это можно сделать в 'O (n)' time с 'O (1)' дополнительным пространством – arunmoezhi

+0

Я должен подкрасить свои производные O (n): P – tdstein

+0

И в вашем коде есть 'arrayOutOfBoundsException'. Угадайте, что это опечатка :) – arunmoezhi

0

Во-первых, проблема в том, что на самом деле вы пытаетесь получить доступ к элементу, который не существует. Whe запустить этот код

array[i] = array[i+1]; 

и «Я» переменной 2, делает я + 1 приведет вас к массиву [3], не существует.

Кроме того, работая непосредственно с массивом может привести к проблемам потребления памяти, если вы triying сортировать, вы должны лучше, используя коллекции, проверить http://docs.oracle.com/javase/tutorial/collections/algorithms/ хороший учебник о том, как обращаться с этим видом операций

0

вы можете итерацию от конца до начала. Вы начинаете с создания пустого слота в конце, а затем начинаете заполнять пустой слот предыдущим значением. Нет необходимости создавать временный массив.Все делается in place.

int n=3; 
int[] array = new int[n]; 
int last = array[n-1]; //copy last element into buffer thus creating an empty slot 
for(int i=n-1;i>0;i--) //iterate from end to begin 
{ 
    array[i] = array[i-1]; //push previous element into current location(an empty slot) 
} 
array[0] = last;   //finally put the last element into initial slot 
Смежные вопросы