这看起来很简单,但我收到错误"Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at reverse.main(reverse.java:28)"
我最初从用户那里获取输入来编写数组,然后我想向后打印数组。我知道还有其他方法可以做到这一点,但我主要想知道为什么这不起作用。逐行完成它是有道理的吗?
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 :(得分:6)
当i = 0时,n-i将得到n,它比可用索引(0 - > n-1)大1。
for (i = 0; i < n/2; i++){
j = a1[i];
k = a1[n-i]; //error line;
a1[i]=k;
a1[n-i]=j;
}
答案 1 :(得分:0)
Collections.reverse(Arrays.asList(array))
将为您反转数组,然后只打印其值。将这些问题作为练习来做是很棒的,但是如果你在业内工作,通常最好依靠Java API来处理这样的微不足道的事情。可能会比你想出的任何东西更快,更简单。
答案 2 :(得分:0)
正如Samhain所说,当i = 0
,然后是n-i == n
时,它大于数组的最后一个索引(因为数组以索引0开头)。
最简单的解决方案是从n-i
中减去额外的1。
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
需要双打)。你可以使用整数。
这是在ideone上运行的。