2014-02-20 4 views
0

Это кажется достаточно простым, но я получаю ошибку "Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 at reverse.main(reverse.java:28)"ArrayIndexOutOfBoundsException при попытке обратного Массива

Я первоначально принимать входные данные от пользователя, чтобы записать массив, а затем я хочу, чтобы напечатать массив в обратном направлении. Я понимаю, что есть другие способы сделать это, но я в основном хочу знать, почему это не работает. Пройти через линию по линии имеет смысл?

PS. Если это не проблема, есть ли лучший способ сделать это?

import java.util.Scanner; 


public class reverse { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     System.out.printf("Enter the number of values in array: "); 
     Scanner scanner = new Scanner(System.in); 
     int n; 
     n = scanner.nextInt(); 

     double[] a1 = new double[n]; 
     int i; 

     System.out.printf("Enter the value in the array: "); 
     for (i = 0; i < n; i++){ 
      Scanner scanner2 = new Scanner(System.in); 
      a1[i] = scanner2.nextInt(); 
      } 
     double j; 
     double k; 

      for (i = 0; i < n/2; i++){ 
       j = a1[i]; 
       k = a1[n-i]; //error line; 
       a1[i]=k; 
       a1[n-i]=j; 
      } 
     for(i = 0; i < n; i++){ 
     System.out.println(" "+a1[i]); 
    }} 


} 
+0

Зачем создавать новый «Сканер», когда старый уже читает «System.in», просто отлично? – 2rs2ts

+1

Вы должны научиться форматировать свой код, он будет оказывать вам услугу в ближайшем будущем, когда ваши программы станут более сложными! – Vallentin

+0

'k = a1 [n-i];' Когда у вас есть минусы и другие вещи, когда вы пытаетесь вычислить * индекс *, пожалуйста, проверьте ** перед **, что индекс не выходит за рамки. – Maroun

ответ

6

Когда i = 0, n-i приведет к n, что на один больше доступных индексов (0 -> n-1).

for (i = 0; i < n/2; i++){ 
    j = a1[i]; 
    k = a1[n-i]; //error line; 
    a1[i]=k; 
    a1[n-i]=j; 
} 
+0

Да, это объяснение, но код, который вы дали, точно такой же. – 2rs2ts

+0

Я думаю, что они дали тот же код и объяснение, чтобы парень мог его исправить. Лучше учиться этому, нет? – user898465

+1

@ user898465 Для людей, которые приходят и читают этот вопрос позже, это смутит их. Либо исправьте код, либо не включите его в ответ (так как это означает, что это правильное решение). – 2rs2ts

0
Collections.reverse(Arrays.asList(array)) 

Будет ли обратный массив для вас, то просто распечатать его значение из. Это здорово делать такие проблемы, как упражнения, но если вы когда-либо беспокоитесь в этой отрасли, обычно лучше полагаться на API Java для таких простых вещей. Вероятно, это будет быстрее и намного проще, чем все, что вы можете придумать.

+0

Стоит отметить, что массив должен быть объявлен с использованием класса-оболочки (например, здесь 'Double [] array'), иначе это не сработает. –

0

Как сказано Samhain, когда i = 0, то n-i == n, что больше, чем последний индекс массива (поскольку массивы начинаются с индекса 0).

Простейшим решением является просто вычесть дополнительный 1 из n-i.

j = a1[i]; 
k = a1[n-i-1]; 
a1[i]=k; 
a1[n-i-1]=j; 

Кроме того, создание нового Scanner является совершенно ненужным. Просто продолжайте использовать первый, который вы создали.

for (i = 0; i < n; i++){ 
    a1[i] = scanner.nextInt(); 
} 

Наконец, для чего это стоит, если вы используете nextInt вам не нужно, чтобы объявить массив как double[] (и не j и k должны быть двойники). Вы можете просто использовать ints.

Это он работает на ideone.

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