2016-03-17 2 views
0

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

Это то, что должно выглядеть следующим образом:

Array contents: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 
Shift how many positions? 5 

Array contents: 11 12 13 14 15 1 2 3 4 5 6 7 8 9 10 
Shift how many positions? 2 

Array contents: 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 
Shift how many positions? 0 

Array contents: 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 
Shift how many positions? -8 

Array contents: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 
Shift how many positions? 15 

Array contents: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 
Shift how many positions? 17 

Array contents: 15 1 2 3 4 5 6 7 8 9 10 11 12 13 14 
Shift how many positions? q 

И им получать это:

Array Contents: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 

Shift how many positions?5 
Array Contents: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 

Вот главный класс:

public class Shift1 { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 

      Scanner kp = new Scanner(System.in); 

       final int size = 15; 
     char q = 'y'; 
     boolean flag = false; 

     Shifter test = new Shifter(size); 

     test.display(); 
     System.out.println(); 


      Scanner input = new Scanner(System.in); 
      System.out.print("Shift how many positions?");{ 

      int value1 = input.nextInt(); 
      test.shift(value1); 
      test.display(); 
     } 
    } 
} 

А вот дополнительный класс:

public class Shifter 
{ 

public int [] data=new int[15]; 
    public Shifter() 
    { 
     int size=0; 
} 

public Shifter(int size){ 

    for (int i = 0; i < data.length; i++) 
    { 
     Random r = new Random(15); 
     int second = r.nextInt(15) + 1; 
     int temp = data[i]; 
     data[i] = data[second]; 
     data[second] = temp; 
    } 
} 

public void shift(int pos){ 
    for(int x=0; x<pos; x++) 
    { 
     int cnt = data.length-1; 
     int temp = data[cnt]; 
     for(cnt=data.length-1; cnt>0; cnt--) 
    { 
     data[cnt] = data[cnt]-1; 
    } 
     data[0] =temp; 
    } 
} 
public void display(){ 
    String values = ""; 
     for (int i = 0; i < data.length; i++) 
     { 
      if (i < 15) 
     { 
      values += (i + 1); 
      if (i < 14) 
     { 
      values += ", "; 
     } 
    } 
} 
     System.out.printf("Array Contents: %s \n", values); 
    } } 
+0

Существует эффективный трюк для смещения массива по n позициям, который включает в себя реверсирование частей массива. Посмотрите, сможете ли вы это заметить. –

ответ

0
  • Внедрение цикла в main() метод.
  • Сначала прочитайте как строку, чтобы распознать q.
  • Внесите Shifter.shift() должным образом.
  • Добавьте пробел после запроса.
  • Инициализируйте массив правильно.
  • Внесите Shifter.display() должным образом.

Исправленные коды:

public static void main(String[] args) { 

    Scanner kp = new Scanner(System.in); 

    final int size = 15; 
    char q = 'y'; 
    boolean flag = false; 

    Shifter test = new Shifter(size); 
    Scanner input = new Scanner(System.in); 

    for(;;) { 
     test.display(); 
     System.out.println(); 
     System.out.print("Shift how many positions? "); 

     String value = input.next(); 
     if (value.equals("q")) break; 
     int value1 = Integer.parseInt(value); 
     test.shift(value1); 
    } 
} 

public Shifter(int size){ 

    for (int i = 0; i < data.length; i++) 
    { 
     data[i] = i + 1; 
    } 
} 

public void shift(int pos){ 
    int max = pos % data.length; 
    if (max < 0) max += data.length; 
    for (int x=0; x<max; x++) 
    { 
     int cnt = data.length-1; 
     int temp = data[cnt]; 
     for(cnt=data.length-1; cnt>0; cnt--) 
     { 
      data[cnt] = data[cnt-1]; 
     } 
     data[0] =temp; 
    } 
} 
public void display(){ 
    String values = ""; 
    for (int i = 0; i < data.length; i++) 
    { 
     values += " "; 
     if (data[i] < 10) values += " "; 
     values += data[i]; 
    } 
    System.out.printf("Array Contents: %s \n", values); 
} 

Хотя есть больше очков, чтобы быть улучшены, это работает, как вы сказали.

+0

Спасибо за помощь! – Mclova1

0
for(int x=0; x<pos; x++) { 
    int cnt = data.length-1; 
    int temp = data[cnt]; 

    for(cnt=data.length-1; cnt>0; cnt--) { 
     data[cnt] = data[cnt]-1; 
    } 
    data[0] =temp; 
} 

В вашем методе shift вы должны используя свой x для цикла переменной. cnt и temp всегда одинаковы независимо от того, что. Так что вы ничего не делаете в этом цикле.

Если вам разрешено использовать что-либо, кроме Array, можете взглянуть на использование List. Она имеет уникальный метод, такой как

http://docs.oracle.com/javase/7/docs/api/java/util/List.html#add(int,%20E)

, который позволит Вам добавить номер в 0 индекса, и он будет автоматически смещаться существующие значения права. Таким образом, вытащите значение с конца и переместите его на фронт size количества раз.

+0

«Так что вы ничего не делаете в этом цикле». Это не верно. Этот цикл каким-то образом обновит 'data', если' pos> 0'. – MikeCAT

Смежные вопросы