3

私は学業のためにこの問題を解こうとしてきましたが、一生わからないのです。問題は次のとおりです。「worked_example_1/babynames.txt」を読み取り、boynames.txt と girlnames.txt の 2 つのファイルを作成し、男の子と女の子のデータを分離するプログラムを作成します。

これは、この問題に対する wiley.com/go/javaexamples の Worked Example 11 のコードです。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class BabyNames
{
public static final double LIMIT = 50;

public static void main(String[] args) throws FileNotFoundException
{
    Scanner in = new Scanner(new File("babynames.txt"));

    RecordReader boys = new RecordReader(LIMIT);
    RecordReader girls = new RecordReader(LIMIT);

    while (boys.hasMore() || girls.hasMore())
    {
        int rank = in.nextInt();
        System.out.print(rank + " ");
        boys.process(in);
        girls.process(in);
        System.out.println();
    }

    in.close();
}
}

この:

import java.util.Scanner;

public class RecordReader
{
private double total;
private double limit;

public RecordReader(double aLimit)
{
    total = 0;
    limit = aLimit;
}

public void process(Scanner in)
{
    String name = in.next();
    int count = in.nextInt();
    double percent = in.nextDouble();

    if (total < limit)
    {
        System.out.print(name + " ");
    }

    total = total + percent;
}

public boolean hasMore()
{
    return total < limit;
}
}

babynames.txt を作成し、.java ファイルと同じ src フォルダーに配置しました。ファイルへの直接パスを指定すると、ファイルが見つかりませんでした。

Scanner in = new Scanner(new File("C:/Users/me/SkyDrive/Schoolwork/CIS150AB/Chapter 11.1/src/babynames.txt"));

ファイルは見つかりますが、次のエラーが表示されます。

Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at BabyNames.main(BabyNames.java:20)

私には、このエラーは 20 行目の int rank = in.nextInt(); が原因のように見えます。intを探すときに文字列を探しますが、これはWileyのWebサイトから直接なので、よくわかりません。

どうやら私はJavaのオンラインクラスを対象としていないようです。次のクラスは、スケジュールに合わせて学校で受講します。

4

1 に答える 1

0

これが babynames.txt の形式である場合、これが起こることになります (私は試していないと思います) 。

  • スキャナ "in" は最初の int を "rank" に読み込みます (OK)
  • boys.process() に入ります
    • 「で」は名前を読みます (Jacob)
    • 「in」は最初の int (1) を読み取ろうとしますが、int ではない 1.0013 を見つけます。

このシナリオはあなたのエラーとは一致しません (BabyNames からではなく RecordReader からスタックトレースを取得します) が、考え方はうまくいくかもしれません。

デバッガで試してみてください。できない場合は、in.nextInt() または in.nextDouble() ではなく in.next() を使用してください。値を印刷して、それがあなたが思っているものではない理由を確認することができます。

あなたの質問は実際には2つの質問を提起します。隠されたものへの答えは次のとおりです。

try (InputStream inputStream = BabyNames.class.getResourceAsStream("/babynames.txt");
     Scanner in = new Scanner(inputStream))
{
    // do stuff with in
}
于 2013-10-03T13:24:49.637 に答える