2015-12-05 53 views
0

我正在嘗試使用方法將數組中的元素左移n(某些隨機數)。難點在於將數組起始處的元素與末尾的元素交換。這是我的代碼到目前爲止。在n數組中循環移位元素n

其他陣列問題與此不同。

public class Shifty { 

    private int[] datas = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; 

    public Shifty() { 
     datas = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; 
    } 

    public int shift(int position) { 
     int tmp = 0; 
     int[] tmp1 = new int[12]; 
     for (int i = 0; i <= 12; i++) { 
      if (i < position) { 

        tmp1[12-position] = this.datas[i]; 

      } else { 
       this.datas[i] = this.datas[i+1]; 
          } 
      for (int j = 12-position; j <= 12; j++){ 
       this.datas[j] = tmp1[j]; 
      } 
     } 

     return position; 
    } 

    public void display() { 
     System.out.println(Arrays.toString(this.datas)); 
     System.out.println(); 
    } 
} 
+0

例如看到這個:http://stackoverflow.com/questions/18659792/circular-arraylist-extending-arra- sylist和http://stackoverflow.com/questions/7266042/java-ring-buffer –

+0

你的'tmp1'太小 - 應該是int [13],但int [datqs.length]會更穩健。在你的代碼中使用'12'也是一樣。 – Jan

+0

哦,不好意思打錯了。糟糕的手機鍵盤。 – Jan

回答

1

你可以很好地利用模運算。

public void shift(int n) { 
    int[] temp = new int[datas.length]; 
    for (int i = 0; i < temp.length; i++) { 
    temp[i] = datas[(i + n) % temp.length]; 
    } 
    datas = temp; 
} 
0

既然你顯然不要做到位的轉變,可以使用臨時數組,該解決方案是非常簡單的:

public class Shifty { 

    private int[] datas = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; 

    public Shifty() { 
     datas = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; 
    } 

    public int shift(int position) { 
     final int len = datas.length; 
     int[] tmp = Arrays.copyOf(datas, position); 
     System.arraycopy(datas, position, datas, 0, len - position); 
     System.arraycopy(tmp, 0, datas, len - position, position); 
     return position; 
    } 

    public void display() { 
     System.out.println(Arrays.toString(this.datas)); 
     System.out.println(); 
    } 
} 

這隻適用於調用具有參數值轉移這些是datas的合法下標。如果要處理負值或大於datas.length的值,則需要將position減少到適當的範圍。請注意,由於這是一個循環移位,所以在這裏可以使用模塊化算術,因爲shift(position)shift(position * n*datas.length)應該對任何整數值n產生相同的結果。