2017-10-07 3 views
0

こんにちは私はスキャナの方法hasNextDouble()に問題があります。 私のコードはファイルから読み込み、配列に追加するVehicleオブジェクトを作成します。車両クラスには、OversizedVehicleというサブクラスがあり、その高さを示すフィールドとしてdoubleが追加されています。だから私はif (hasNextDouble())を使用しているので、スキャナがdoubleを読み取るとVehicleの代わりにOversizedVehicleオブジェクトが作成されます。ここに私のコードは次のとおりです。hasnextdoubleはファイル内の次のダブルを読み取っていません

while(s1.hasNext()) 
    { 
      regNo = s1.next(); 
      make = s1.next(); 
      year = Integer.parseInt(s1.next()); 
      description = s1.next(); 
      if(s1.hasNextDouble() == true) { 
      height = s1.nextDouble(); 
      vehicle = new OversizedVehicle(regNo,make,year,description,height); 
      } 
      else { 
      vehicle = new Vehicle(regNo, make, year, description); 
      } 
      System.out.println("New vehicles from file added to array in position " + count); 
      vehicles[count] = vehicle; 
      count++; 
    } 

私は、Eclipse IDEを使用していますが、私はデバッグモードでこれを実行するとif文は常に間違ってheight変数に入力して、次regNoを入れ、trueに評価されます。入力値がdoubleではなく、intです。私は何がうまくいかないのか分かりません。それはあなたの入力パラメータの彼らの数が異なっている特大車、のパラメータを含んでいるように思える

+2

入力ファイルはどのようなものですか? – unjankify

+1

大文字と小文字を区別して、この判読不能な段落を段落にして、 '' hasNextDouble() 'を定義して次の倍精度を読み込まないようにしてください。代わりに何が起こるのですか? – EJP

答えて

0

1 Toyota 2015 sedan 2 Toyota 2016 truck 2.1 3 Toyota 2015 mini ... 
:車両は4つのパラメータを持っているが、特大車は、5本のようなものを持っています

など。私はこれを推測しています。s1.hasNextDouble()は常に真であり、 であり、は "変数regNoがダブルに初期化されます"です。 たとえば、上記の例でスキャナが "sedan"を読み取ったときに、 の次のトークンが "2"、 であり、有効なdoubles1.hasNextDouble()が有効である可能性があるためです。 つまり、s1.hasNextDouble()は、次のトークンが2倍または整数の場合にtrueになります。

ことがintためdoubletrueためfalseを返しますので、あなたはs1.hasNextInt()、 をチェックすることにより、これらのケースを区別することができます。

while (scanner.hasNext()) { 
    String regNo = scanner.next(); 
    String make = scanner.next(); 
    int year = scanner.nextInt(); 
    String description = scanner.next(); 

    if (scanner.hasNext() && !scanner.hasNextInt()) { 
    double height = scanner.nextDouble(); 
    vehicle = new OversizedVehicle(regNo, make, year, description, height); 
    } else { 
    vehicle = new Vehicle(regNo, make, year, description); 
    } 

    // ... 
} 

これは上記の例でも有効です。 しかし、データが行単位である場合は、 レコードを区別するために行区切り記号を使用することをお勧めします。 これにより、実装が少しシンプルになります。

while (scanner.hasNext()) { 
    String line = scanner.nextLine(); 
    String[] parts = line.split(" "); 
    String regNo = parts[0]; 
    String make = parts[1]; 
    int year = Integer.parseInt(parts[2]); 
    String description = parts[3]; 

    if (parts.length == 5) { 
    double height = scanner.nextDouble(); 
    vehicle = new OversizedVehicle(regNo, make, year, description, height); 
    } else { 
    vehicle = new Vehicle(regNo, make, year, description); 
    } 

    // ... 
} 
+0

大変ありがとう!それを考えなかった。 :) :) – alexW

関連する問題