0

テキスト(file.txt)ファイルがあります。このファイルはスキャナー内にロードされます。

ファイルにはさまざまな行があり、各行には2つのdoubleと1つの整数値がスペースで除算されています。

このような:

1.0 1.2 2
0.9 1.0 10
50.4 9.2 20

3つの配列を満たす必要があります。

各配列は列に対応します。何かのようなもの:

double[] x = {1.0,0.9,50.4}
double[] y = {1.2,1.0,9.2}
double[] z = {2,10,20}

私はこのコードを使用してこれを試みました:

        double x[]= new double [3];
        double y[]= new double [3];
        double z[]= new double [3];

        File f = new File(ClassLoader.getSystemResource(file.txt).toURI());
        Scanner sc = new Scanner(f);
        String aux;

        for (int i=0;i<3;i++){
               aux = sc.next();
               x[i] = Double.parseDouble(aux);
               aux = sc.next();
               y[i] = Double.parseDouble(aux);
               aux = sc.next();
               z[i] = Double.parseDouble(aux);
       }

しかし、最初のDouble.ParseDouble()の場合、「NumberFormatException」が発生します。

デバッグを実行しましたが、変数auxの値はdouble(1.0など)であるため、Double.parseDouble(aux)が機能するはずです。

奇妙なのは、(例外が起動されたときに)「aux」が「1.0」のようなものであると言っていることです(前に「」が付いています)

'、、、またはのように、すべてのシンボルを削除する方法はありますか?または「bom」(「特別なスペース」など)など?つまり、ファイルの「非表示」シンボルのリストがわからないため、可能なシンボルの完全なリストを指定する必要はありません(つまり、ファイルの編集時に表示されないシンボル)。

ヒントありがとうございます。

4

1 に答える 1

2

あなたのファイル入力があなたが述べているのとまったく同じであると確信していますか?

正確なファイル入力を「numbers.txt」というファイルにコピーして貼り付け、以下のクラスを実行しました。意図したとおりに機能しているようです。

public class NumberParser
{
    public static void parseData(String resourceName)
    {
        Scanner s = new Scanner(NumberParser.class.getResourceAsStream(
             resourceName));

        double [] x = new double[3];
        double [] y = new double[3];
        int [] z = new int[3];

        for (int i = 0; i < 3; i++)
        {
            x[i] = s.nextDouble();
            y[i] = s.nextDouble();
            z[i] = s.nextInt();
        }

        System.out.println(Arrays.toString(x));
        System.out.println(Arrays.toString(y));
        System.out.println(Arrays.toString(z));
    }

    public static void main(String[] args)
    {
        parseData("numbers.txt");
    }
}

入力が(コンマ、引用符などで)述べたものとまったく同じではないが、基本的にこれらのマークで区切られた数字である場合は、区切り文字(意味のあるトークンの間のもの)を探しているもの以外のものにすることができます。

public static void parseMessedUpData(String resourceName)
{
    Scanner s = new Scanner(NumberParser.class.getResourceAsStream(
        resourceName));
    s.useDelimiter("[^0-9.]++"); // <-------

    double [] x = new double[3];
    double [] y = new double[3];
    int [] z = new int[3];

    for (int i = 0; i < 3; i++)
    {
        x[i] = s.nextDouble();
        y[i] = s.nextDouble();
        z[i] = s.nextInt();
    }

    System.out.println(Arrays.toString(x));
    System.out.println(Arrays.toString(y));
    System.out.println(Arrays.toString(z));
}
于 2012-06-03T13:31:30.260 に答える