2

スキャナーを使用してファイルを読み込んでいます。ファイルは、最初の行が配列の次元になるようにフォーマットされています。次の行には 1 番目の行、次の行には 2 番目の行が含まれます。例のファイル:

3 3
1 2 3
4 5 6
7 8 9

私が実行し続ける問題は、配列の値がすべて 9 のように見えることです。ファイルは int ですが、double が必要です。何が起こっているのかをデバッグしようとしているので、そこには多くの印刷ステートメントもあります。例外処理が完了していません。配列を正しくインスタンス化できるようになったら、戻って強化します。任意のポインタをいただければ幸いです。たとえば、ファイルを一度開くだけで、次元を取得して配列をインスタンス化するより良い方法です。

更新されましたが、nullPointerException を取得しています

public class Help implements TopoMapInterface {

private String filename;
private File mapfile;
public double[][] baseMap;
public double[][] enMap;
public int enhancementLevel;

public Help(String filename) throws FileNotFoundException,
        InvalidFileFormatException {
    this.filename = filename;

    System.out.println("Reading in file: " + filename);

    String number = "";
    int row = 0;
    int col = 0;
    int count = 0;

    try {
        Scanner inputFile = new Scanner(new File(filename));

        while (inputFile.hasNextInt()) {
            row = Integer.parseInt(inputFile.next());
            col = Integer.parseInt(inputFile.next());
            System.out.println("Row : " + row);
            System.out.println("Col : " + col);
            baseMap = new double[row][col];
            System.out.println(baseMap[2][4]);
            for (int i = 0; i < baseMap.length; i++){
                for (int j = 0; j < baseMap[i].length; j++){
                    baseMap[i][j] = Double.parseDouble(inputFile.next());
                }
            }
        }
    } catch (Exception e) {
        System.out.println(e.toString());
    }
4

5 に答える 5

2

最初の行に最初に行の値があり、次に列の値があると仮定します

私はこれをするだろう

int row = Double.parseDouble(inputFile.next());
int col = Double.parseDouble(inputFile.next());


for (int i = 0;i<row;i++){
for(j=0;j<col;j++)
{
baseMap[i][j]=Double.parseDouble(inputFile.next());
}}

これは、必要に応じてすべての値を double に保存する必要があるため、ファイルから読み取った後に保存する方が簡単だと思います。

私はあなたの質問が正しいと思います!

于 2013-09-09T05:34:01.653 に答える
1

のときに数値を読み取るたびにcount1 > 2、マトリックス全体を反復処理し、すべてdoubleValのセルに挿入します。最後に表示される値は 9 であり、それがどこにでもあります。

より一般的に言えば、正しい入力が保証されている場合 (つまり、このような学校の演習がある場合)、ループ内でディメンション仕様を読み取るべきではありません。最初の 2 つの を読み取り、intそのサイズに基づいて配列を作成してから、ネストされたforループを使用して値を配列に挿入する必要があります。

于 2013-09-09T05:23:04.203 に答える
0
for (int r = 0; r < baseMap.length; r++){
    for (int c = 0; c < baseMap[r].length; c++){
        baseMap[r][c] = doubleVal;
    }
}

問題があるところです。これは、配列のすべての行と列を繰り返し処理し、最後に表示される数字が 9 であるため、すべての要素を現在の数字に設定します。これが配列に残されるものです。

本当に必要なのは、配列を反復処理するのではなく、行数と列数を追跡する別の方法です。おそらくカウンターのペア?

int intVal = Integer.parseInt(number);
double doubleVal = (double) intVal;

おそらく double doubleVal = Double.parseDouble(number); に置き換える必要があります。

No Idea For Name によって与えられたファイル読み取りの改善により、このコードが大幅に改善されます。using は Java 7 以降のみの構成ですが。以前のバージョンの場合。可能であればアップグレードしてください。それ以外の場合は、忘れずにリソースを閉じてください。

于 2013-09-09T05:30:18.037 に答える