使用数组查找最大和最小数的Java代码

3

我需要编写一个程序,从用户输入中获取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块来解决这个问题吗?

3
你误解了 for each 循环的工作原理。当你写 for (int i : numbers) 时,i 不是索引,而是数组中实际的数字。 - Paul Boddington
try catch 块不能解决错误,它只是以一种优雅的方式处理错误。您能否突出显示第 32 行是哪一行? - Ace McCloud
@PrasaanthNeelakandan 这是第32行代码:如果(numbers [i] < smallest) - Christian Lapinig
1
请查看pbabcdefp的第一条评论和/或我的回答。 - Ace McCloud
8个回答

2

你的问题与其他答案中已经提到的for循环使用方式有关。然而,在Java 8中更短的方法是使用流:

IntStream.of(numbers).max()IntStream.of(numbers).min()


显然的缺点是需要对数组进行两次迭代。 - Brett Okken
@BrettOkken 对于10个数字来说并不重要。 - Bubletan

1
for (int counter = 0; counter <= numbers.length; counter++) 

你输入了=<,实际上应该输入<。如果计数器等于长度,则会尝试超出范围,因为索引从零开始。

他将会有10 + 1个元素。 - almeynman

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

这个可以运行!但是当我在终端再次运行它时,它给出了最大数的正确值,但最小偶数却为0,尽管我的最小输入是2? - Christian Lapinig
在将值添加到数组之前,您正在将smallestlargest的值初始化为数组中的第一个元素,因此它们都设置为0的初始值。没有任何值小于0,因此smallest保持为0。您有比这更大的值,因此largest有效。将您的smallest值初始化为Integer.MAX_VALUE,我认为您会发现它找到了正确的值。(您可以将largest初始化为Integer.MIN_VALUE)。 - Danny

0

更改

for (int i : numbers) {

for (int i=0;i<numbers.length;i++) {

0

你的问题出在这个循环中:

for (int i : numbers) {

这个循环迭代数组的元素,而不是它们的索引。因此,你可以这样说:

for (int a : numbers) {
   if(a > ...) {
   ....
}

或者你可以使用类似以下的数组索引:

for (int i = 0; i < numbers.lenth; i++) {
   if(numbers[i] > ...) {
   .....
}

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 <= 转换为 <

for (int counter = 0; counter < numbers.length; counter++) {
            System.out.printf("%5d%8d\n", counter, numbers[counter]);
        } 

Try catch 块将以优雅的方式处理您的错误。但它不会解决您的问题。


0

正如许多人指出的那样,您正在使用for-each循环的值作为索引,这意味着您的代码尝试访问用户在数组中输入的任何数字的位置。

因此,要修复它,您只需要执行以下操作:

smallest = i;

并且

largest = i;

0
在Java 8中,您可以获取一个IntStream并获得摘要统计信息
final IntSummaryStatistics stats = IntStream.of(numbers).summaryStatistics();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接