Java

Scannerクラスの標準入力でハマったので記録

More than 1 year has passed since last update.

hasNext()メソッドについて

Codeなんちゃらというクイズサイトに挑戦してみた。
下記はその時作った回答。
ScannerクラスでhasNext()メソッドではまってしまった。
標準入力をスキャンの対象として実行する時に、hasNext()関数は標準入力の最後にCtrl+zで入力をちゃんと終了させてあげないとfalseを返しません。よって、ちゃんと終了をしてあげないとループから抜け出ません。

これにずっと気付かないままかなり時間くった・・・。

以上

package questions;

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        int count = 1;
        int member = 0;
        String input = null;
        double resultAvgs[] = new double[12];

        try{
            Scanner scanner = new Scanner(System.in);

            // resultAvgs[]へ格納
            while(scanner.hasNext()){
                input = scanner.nextLine();
                resultAvgs[member] = calcAvrg(input);
                member += 1;
            }

            for(int i=0; i<member; i++){
                for(int j=0; j<member; j++){
                    if(i==j){
                        continue;
                    }else{
                        if(resultAvgs[i] >= resultAvgs[j]){
                            // 少ない値があれば順位を一つ落とす
                            count += 1;
                        }
                    }
                }
                System.out.println(count);
                // 初期化
                count = 1;
            }

            scanner.close();

        }catch(NullPointerException e){
            e.printStackTrace();
        }
    }

    // レース結果を読み込んで調和平均を算出
    static double calcAvrg(String in) {
        double total = 0;
        String[] results = in.split(" ", 0);

        for (String result : results) {
            double buff = 1 / Double.parseDouble(result);
            total += buff;
        }

        return results.length / total;
    }
}