Javaにオブジェクトの配列があり、1つの要素を一番上に移動し、残りを1つ下に移動しようとしています。
サイズ10の配列があり、5番目の要素をプルしようとしているとします。 5番目の要素は0
の位置に入り、0から5までのすべての要素が1つ下にシフトされます。
このアルゴリズムは、要素を適切にシフトしません。
Object temp = pool[position];
for (int i = 0; i < position; i++) {
array[i+1] = array[i];
}
array[0] = temp;
どうすれば正しくできますか?
配列が{10,20,30,40,50,60,70,80,90,100}であると仮定します
あなたのループがすることは:
反復1: array [1] = array [0]; {10、10、30、40、50、60、70、80、90、100}
反復2: array [2] = array [1]; {10,10,10,40,50,60,70,80,90,100}
あなたがすべきことは
Object temp = pool[position];
for (int i = (position - 1); i >= 0; i--) {
array[i+1] = array[i];
}
array[0] = temp;
論理的には機能しないため、ループを逆にする必要があります。
for (int i = position-1; i >= 0; i--) {
array[i+1] = array[i];
}
または、使用することができます
System.arraycopy(array, 0, array, 1, position);
Collections.rotate(List<?> list, int distance)
を使用できます
Arrays.asList(array)
を使用してList
に変換します
詳細: https://docs.Oracle.com/javase/7/docs/api/Java/util/Collections.html#rotate(Java.util.List、%20int)
発見したように、この方法で配列を操作するとエラーが発生しやすくなります。より良いオプションは、状況で LinkedList を使用することです。リンクリストとすべてのJavaコレクションを使用すると、配列管理は内部的に処理されるため、要素の移動を心配する必要はありません。 LinkedListを使用すると、remove
を呼び出してからaddLast
を呼び出すだけで完了です。
これを試して:
Object temp = pool[position];
for (int i = position-1; i >= 0; i--) {
array[i+1] = array[i];
}
array[0] = temp;
動作を確認するには、こちらをご覧ください: http://www.ideone.com/5JfAg
サイズnの配列の左回転操作は、配列の各要素ユニットを左にシフトします。これを確認してください!!!!!!
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;}
}}
}
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;
}
}
Javaリストとして配列データがある場合の別のバリエーション
listOfStuff.add(
0,
listOfStuff.remove(listOfStuff.size() - 1) );
私がこれに出くわした別のオプションを共有しているだけですが、 @ Murat Mustafin からの答えはリストで行く方法だと思います
1つの位置でシフトする代わりに、このようなモジュールを使用してこの関数をより一般的にすることができます。
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];
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;
}
ループの最初の反復で、array[1]
の値を上書きします。逆の順序でインデックスを確認する必要があります。
以下のコードを使用して、回転しないシフトを行うことができます。
int []arr = {1,2,3,4,5,6,7,8,9,10,11,12};
int n = arr.length;
int d = 3;
サイズn
の配列をd
要素だけ左にシフトするためのプログラム:
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];
}
}
サイズn
の配列をd
要素だけ右にシフトするためのプログラム:
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];
}
}