web-dev-qa-db-ja.com

Integer.parseInt(scanner.nextLine())とscanner.nextInt()

私の教授は、ユーザーから番号を取得するために次のことを行う傾向があります。

_Scanner scanner = new Scanner(System.in);
Integer.parseInt(scanner.nextLine());
_

単にscanner.nextInt()を実行するのとは対照的に、どのような利点がありますか?

_Java.util.Scanner.Java_には次のものが含まれています。

_public int nextInt() {
    return nextInt(defaultRadix);
}

public int nextInt(int radix) {
    // Check cached result
    if ((typeCache != null) && (typeCache instanceof Integer)
        && this.radix == radix) {
        int val = ((Integer)typeCache).intValue();
        useTypeCache();
        return val;
    }
    setRadix(radix);
    clearCaches();
    // Search for next int
    try {
        String s = next(integerPattern());
        if (matcher.group(SIMPLE_GROUP_INDEX) == null)
            s = processIntegerToken(s);
        return Integer.parseInt(s, radix);
    } catch (NumberFormatException nfe) {
        position = matcher.start(); // don't skip bad token
        throw new InputMismatchException(nfe.getMessage());
    }
}
_

私が見ているように、Scannerは、追加のhocus pocusに加えて、Integer.parseInt()自体も呼び出します。単にInteger.parseInt(scanner.nextLine())を実行すると、パフォーマンスが大幅に向上しますか?一方、欠点はありますか?

ユーザー入力ではなく、大量のデータを含むファイルをスキャンする場合はどうでしょうか。

6
Olavi Mustanoja

2つの観察があります:

  1. myScannerInstance.nextInt()を使用すると改行文字が残るため、nextLine()の後にnextInt()を呼び出すと、nextLine()は代わりに改行文字を読み取ります。実際のデータの。したがって、nextLine()の後に別のnextInt()を追加して、そのdangling改行文字を食いつぶす必要があります。 nextLine()は改行文字を残しません。

コード:

int age=myScannerInstance.nextInt();
String name = myScannerInstance.nextLine();// here the actual name will not be read. The new line character will be read.
  1. nextInt()は再び基になるストリームに戻り、読み取ります。 IO呼び出しには時間がかかります(高価です)。次の整数を取得するために多くのチェックが実行されます。nextLine()はそれらのチェックを1回だけ実行します。したがって、nextLine() 1回、5つの整数を(1行の文字列として)読み取り、分割して整数として解析します(Integer.parseInt()を使用)。各intを個別に読み取るよりも高速で効率的です。

nextLine() + parseInt()を使用すると、非常に大きなループを実行しているときにパフォーマンスが大幅に向上します。

使用法 :

nextInt()を使用すると、入力テキストが整数でない場合に例外が発生するという追加の利点があります。例123が受け入れられます。123sdsaInputMismatchExceptionをスローします。だから、あなたはそれを捕まえて適切に扱うことができます。

nextLine()を使用すると行全体が読み取られるため、文字列sada1231全体が読み取られ、文字列を数値として解析できない場合はNumberFormatExceptionで失敗します。その例外を処理する必要があります。

一般に、1回のnextLine()/nextInt()呼び出しは大きな違いにはなりません。ループがある場合、または大量のデータを読み取る場合は、readLine()parseInt()とともに使用すると非常に効率的です。

11
TheLostMind

私もよくこの問題に直面していました。だから私はこのようなコーディングに使用します。

_public static void main(String[] args) {
    Scanner key= new Scanner(System.in);
    String name;
    int    age;
    age = key.nextInt();
    key.nextLine();
    name = key.nextLine();  //to carry the new line character left behind nextInt()
    System.out.println("Age : "+age);
    System.out.println("Name: "+name);
}
_

ここでは、key.nextInt()が改行文字を残すため、key.nextLine()を使用して改行文字を運び、実際のデータが存在する次の行に移動します。上で説明したように、Integer.parseInt()を使用すると、nextInt()を使用するよりも効率的です。しかし、これは問題を克服するためのコーディング方法の1つでもあります。

0
Sanoaf

nextInt()は数値を読み取りますが、行区切り文字を使用しません。 nextLine()は文字列を読み取り、改行文字を消費します。 Java Docs によると:

…このメソッドは、最後の行区切り文字を除いて、現在の行の残りを返します。位置は次の行の先頭に設定されます。

つまり、数値を入力してEnterキーを押すと、input.nextInt()は「行末」ではなく数値のみを消費し、int、doubleなどのプリミティブデータタイプは「行末」を消費しません。 「行末」はバッファに残りますaneinput.next()が実行されると、最初の入力からバッファから「行末」が消費されます。したがって、教授はユーザー入力を読んだ後、次の行に移動しようとしています。あなたは彼のコードの論理を見なければなりません、そうすればあなたはそれを理解することができます。

0
Payam