我应该创建一个程序,从用户输入中获取10个数字,找到最大和最小的数字,并显示用户的所有输入。该程序使用数组。这是我的代码:
import java.util.Scanner; // program uses Scanner
public class ArrayTester {
// begin execution
public static void main(String[] args) {
// declare and create array object
// declare smallest and largest int variables
int[] numbers;
numbers = new int[10];
int smallest = numbers[0], largest = numbers[0];
// create Scanner object
Scanner input = new Scanner(System.in);
// prompt user
System.out.print("Please enter 10 numbers: \n");
// use for loop to obtain user input
for (int counter = 0; counter < numbers.length; counter++) {
numbers[counter] = input.nextInt();
} // end obtaining input
// enhanced for loop to find largest and smallest values
for (int i : numbers) {
if (numbers[i] < smallest) {
smallest = numbers[i];
} // end finding smallest
else if (numbers[i] > largest) {
largest = numbers[i];
} // end finding largest number
} // end finding largest and smallest values
// for loop to print user input
System.out.printf("%s%8s\n", "Index", "Input");
for (int counter = 0; counter <= numbers.length; counter++) {
System.out.printf("%5d%8d\n", counter, numbers[counter]);
} // end printing input values
// print smallest and largest numbers
System.out.printf("Smallest number: %d\nLargest number: %d\n", smallest, largest);
System.out.print("Programmed by Christian Lapinig");
} // end main
} // end ArrayTester
此时我能够获得用户输入,但我遇到了这个问题:
Please enter 10 numbers:
454
392
33
41
6
44
39
21
12
2
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 454
at ArrayTester.main(ArrayTester.java:32)
我需要一个try和catch块来解决这个问题吗?
答案 0 :(得分:1)
for (int counter = 0; counter <= numbers.length; counter++)
您放=<
,而应放<
。如果counter等于length,它会尝试超出范围,因为索引从零开始。
答案 1 :(得分:1)
try-catch
只会吞下异常。你的问题是增强的for循环是在迭代数组的值,但是你把它当作索引来处理,所以你检查numbers[454]
并立即爆炸,因为你'超出阵列的长度。
迭代索引,或直接使用值:
for (int i : numbers) {
if (i < smallest) {
smallest = i;
} // end finding smallest
else if (i > largest) {
largest = i;
} // end finding largest number
} // end finding largest and smallest values
答案 2 :(得分:1)
您的问题与您使用for循环的方式有关,如其他答案中所述。但是,Java 8中的一种较短的方法是使用流:
IntStream.of(numbers).max()
和IntStream.of(numbers).min()
答案 3 :(得分:0)
CHange
for (int i : numbers) {
到
for (int i=0;i<numbers.length;i++) {
答案 4 :(得分:0)
你的问题就在这个循环中:
for (int i : numbers) {
此循环意味着遍历数组的元素,而不是其索引。所以,你可以说:
for (int a : numbers) {
if(a > ...) {
....
}
或者你可以使用数组索引,如下面的“
for (int i = 0; i < numbers.lenth; i++) {
if(numbers[i] > ...) {
.....
}
答案 5 :(得分:0)
将其更改为:
for (int i=0 ;i< numbers.length; i++) {
if (numbers[i] < smallest) {
smallest = numbers[i];
} // end finding smallest
else if (numbers[i] > largest) {
largest = numbers[i];
} // end finding largest number
}
AND&lt; = to&lt;
for (int counter = 0; counter < numbers.length; counter++) {
System.out.printf("%5d%8d\n", counter, numbers[counter]);
}
尝试catch块将以优雅的方式处理您的错误。它无法解决您的问题。
答案 6 :(得分:0)
在java 8中,您可以获得IntStream
并获取summary statistics。
final IntSummaryStatistics stats = IntStream.of(numbers).summaryStatistics();
答案 7 :(得分:0)
正如许多人所指出的那样,您使用for-each循环的值作为索引,这意味着您的代码会尝试访问您的用户在数组中输入的任何数字的位置。
所以要解决它,你只需要做
smallest = i;
和
largest = i;
答案 8 :(得分:0)
尝试以下代码,
import java.util.Scanner;
public class LargestSmallest
{
public static void main(String[] args)
{
// assigning array of 10 numbers to numerals
int a;
Scanner sc = new Scanner(System.in);
System.out.println("Enter number of elements to find largest and smallest number: ");
a = sc.nextInt();
int numerals[] = new int[a];
System.out.println("Enter " + a + " integers.");
for(int b = 0;b < a;b++)
numerals[b] = sc.nextInt();
// assigning first numeral of an array to largest and smallest
int largest = numerals[0];
int smallest = numerals[0];
for(int x = 1;x < numerals.length;x++)
{
if(numerals[x] > largest)
largest = numerals[x];
else if(numerals[x] < smallest)
smallest = numerals[x];
}
System.out.println("Largest Number is: " + largest);
System.out.println("Smallest Number is: " + smallest);
}
}
有关使用数组click here查找最大和最小数字的更多信息。