1

该程序旨在让用户输入一系列数字,直到用户输入我设置为值 0 的哨兵。在用户输入哨兵后,程序应该打印其中的最高数字和次高数字列表。我遇到的麻烦是我希望第二高的数字是它打印 0 。

有没有更优雅的方法通过使用 ?: 运算符来解决这个问题?是否可以?

import acm.program.*;

public class LargestAndSecondLargest extends ConsoleProgram {

    public void run() {

        int a = 0;
        int b = 0; 

        while (true) {

            int value = readInt(" ?: ");

            if (value == SENTINEL) break;

            if (value > a) {
                a = value;   
            }
            else if (value > b) {
                b = value;
            }
        }

        println("the largest value is " + a);
        println("the second largest number is"  + b);
    }

    private static final int SENTINEL = 0; 
}
4

4 回答 4

2

有两个问题:

  1. 第二个比较是错误的。
  2. 当您遇到新的最高数字时,您需要将之前的最高数字移动到第二高的位置。否则,序列 1、2、3 将产生 3 和 1 作为两个最高数字。
于 2012-11-20T22:19:39.910 回答
1
else if ( b > value )

上述 else if 条件应为:-

else if ( value > b )

否则,b如果您只输入positive数字,您将永远不会改变,因此2nd最大值将是0.

另请参阅@NPE 的答案中的第二个要求,这是必需的。

于 2012-11-20T22:15:41.870 回答
0

将值插入到数组中。对数组进行排序,然后将数组中的前两个值分配到您的输出中。如果根据要求只给出一个值,则将它们都设置为相同的值或 1 为 0。

于 2012-11-20T22:19:33.247 回答
0

这是我的解决方案(您可以适应您的超类):

public class LargeAndSecondLargest {

    public static void main(String[] args) {
        new LargeAndSecondLargest().run("1 2 2");
    }

    public void run(String input) {
        final int SENTINEL = 0;
        int currVal;
        Scanner scanner = new Scanner(input);
        List<Integer> numbers = new ArrayList<>();
        while (scanner.hasNextInt() && ((currVal = scanner.nextInt()) != SENTINEL)) {
            numbers.add(currVal);
        }
        printFirstAndSecondLargest(numbers);
    }

    private void printFirstAndSecondLargest(List<Integer> numbers) {
        Collections.sort(numbers, Collections.reverseOrder());
        System.out.println("the largest value is " + numbers.get(0));
        System.out.println("the second largest number is " + numbers.get(1));
    }
}
于 2012-11-20T22:39:01.030 回答