需要帮助编写一个程序,找到最高和第二高的数字是一个系列

时间:2012-11-20 22:13:52

标签: java

该程序是为用户输入一系列数字而设计的,直到用户输入我设置为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 个答案:

答案 0 :(得分:2)

有两个问题:

  1. 第二次比较是错误的。
  2. 当您遇到新的最高号码时,您需要将之前的最高号码转移到第二高的号码。否则,序列1,2,3将产生3和1作为两个最高数字。

答案 1 :(得分:1)

else if ( b > value )

以上其他条件应为: -

else if ( value > b )

否则,如果您只输入b个号码,则positive永远不会更改,因此2nd最大值将为0

另见@ NPE的answer中的第二个要求,这是必需的。

答案 2 :(得分:0)

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

答案 3 :(得分: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));
    }
}