1

このプログラムは、ユーザーが値 0 に設定された番兵を入力するまで、ユーザーが一連の数字を入力できるように設計されています。リスト。私が抱えている問題は、2 番目に大きい数値が代わりに 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

2 つの問題があります。

  1. 2番目の比較は間違っています。
  2. 新しい最大数に遭遇した場合は、前の最大数を 2 番目に大きいスロットにシフトする必要があります。それ以外の場合、シーケンス 1、2、3 は、2 つの最大数として 3 と 1 を生成します。
于 2012-11-20T22:19:39.910 に答える
1
else if ( b > value )

上記のelseif条件は次のようになります。-

else if ( value > b )

それ以外の場合、数値bのみを入力している場合は変更されないため、最大値はになります。positive2nd0

必然的に必要とされる@NPEの回答の2番目の要件も参照してください。

于 2012-11-20T22:15:41.870 に答える
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 に答える
0

値を配列に挿入します。配列を並べ替えてから、配列の上位 2 つの値を出力に割り当てます。要件に応じて 1 つの値のみが指定されている場合は、両方を同じ値に設定するか、1 つを 0 に設定します。

于 2012-11-20T22:19:33.247 に答える