0

この問題は少し説明が必要です。できるだけ簡潔にしようと思います。

Can オブジェクトの配列を初期化しようとしています。これらのオブジェクトには、名前、製造元の 2 つのフィールド (両方とも文字列) しかありません。

次の形式の CSV ファイルから読み取って、フィールドを初期化しようとしています。

トマト、ハインツ

豆類、ジェリー

(行間にスペースはありません。このサイトでは何らかの理由でそのようにフォーマットされています)

各行の最初の文字列は名前にしたい値で、2 番目はメーカーです。

そこで、CSV の各行を読み取るメソッドを作成しました。このメソッドは、各行をトークナイザー メソッドに渡して単一の値を抽出します。

private void readFile (String inFilename) {
    FileInputStream fileStrm = null;
    InputStreamReader rdr;
    BufferedReader bufRdr;
    int lineNum;
    String line;
        try {
            fileStrm = new FileInputStream(inFilename);
            rdr = new InputStreamReader(fileStrm);
            bufRdr = new BufferedReader(rdr);
            lineNum = 0;
            line = bufRdr.readLine();
            while {line != null) {
                lineNum++;
                processLine(line);  //passes line to tokenizer
                line = bufRdr.readLine();
                 }
            fileStrm.close();
        }
        catch (IOException e) {
            if (fileStrm != null) {
                try { fileStrm.close(); } catch (IOException ex2) { }
             }
             System.out.println("Error in file processing: " + e.getMessage());
        }   
    }

行はこのトークナイザー メソッドに渡されます。

private String processLine(String csvRow) {
    String thisToken = null;
    StringTokenizer strTok;
    strTok = new StringTokenizer(csvRow, ",");
        while (strTok.hasMoreTokens()) {
            thisToken = strTok.nextToken();
        }
}

そして、それは私が少し立ち往生するところです。配列を初期化するには、次のような for ループが必要だと思います

for (int i=0; i<=array.length;i++)
    {
    array[i].name = readFile("filename.csv");
    array[i].manufacturer = readFile("filename.csv");
    }

しかし、明らかにこれは機能しません。誰も私がこれについてどうすればよいか提案できますか? コードをほとんどそのままにして、既存のコードを使用して解決策を見つけたいと思います。

ありがとう

4

1 に答える 1

0

初めにすること: -

を呼び出しprocessLine(line);ていますが、このメソッドからの読み取りを返していませんtoken..したがって、このメソッドで取得したトークンはengulpedそこにあるだけです..したがって、そのメソッドから何かを返す必要があります..

2番:-

array[i].name = readFile("filename.csv");
array[i].manufacturer = readFile("filename.csv");

上記のコードでは、readFile()毎回 2 つの属性を呼び出しています。そのため、何かを返しても、これらの 2 つの属性は同じ値に初期化されます。ファイルを最初から読み始めるたびに..

3番目のこと: -

実際、上記のコードはコンパイルされません.. readFile()(実際には何も返さない)の値を配列に割り当てているため..このメソッドに戻り値の型を指定しますString..そして、読み取ったトークンを返します.. .

編集: - *クラスのsplit()メソッドを使用することをお勧めしますString..Tokenizer is not needed here, for just分割around a singleコンマ(,)`

また、配列を使用するのではなく、ArrayListを使用して、新しく作成objectしたものをオンザフライで追加できます. そうすれば、配列を使用する必要がなくなりますfix the size..ファイルにどれだけの行が含まれるかわかりませんよね?)

あなたができることは次のとおりです: -

  • readFileおそらくどこかからメソッドを呼び出しますmain()

    readFile("filename.csv")
    
  • あなたのreadFile()方法では、ファイルを繰り返し処理して次のArrayListようなものを作成できます: -

    List<Can> yourList = new ArrayList<>();
    while ((line = reader.readLine()) != null) {
    
        String[] wordRead = line.split(',');
        yourList.add(new Can(wordRead[0], wordRead[1]));
    }
    

Can問題で述べたように、クラスの名前だと思います..

于 2012-09-27T04:22:56.700 に答える