0

を含むテキストファイルがあります

r0, 0.5, 1
r1, 0.6, -1
r2, 0.2, 1

ファイルを読み取り、各列を Java の個別の配列に格納します。これは私が書いてきたコードです。レコードでガベージ値のみを取得しています。また、浮動小数点値を読み取ることができません。これを修正する方法を教えてください。

public class Model{
    private String modelname ;
private String[] records ;
private int[] targets ;
private float[] scores ;

    public Model(String name_model, String path) throws NumberFormatException, IOException {


    this.modelname = path+name_model ;
    System.out.println(this.modelname);

    BufferedReader bufferReader = new BufferedReader(new FileReader(path+name_model));
    String line=null;
    int t=0;
    while((line = bufferReader.readLine())!=null) {
        System.out.println(line);
        //String[] strar = line.split(",");
        //String[] strar = line.split("\\s*,\\s*")  ;
        int k=1 ;
        for(String part : line.split(",")) {
            if (k==1) {
                System.out.println(part.trim());
                this.records[t] = part.trim() ;
                            }
            if (k==3)
                this.targets[t] = Integer.valueOf(part.trim()) ;
            if (k==2)
                this.scores[t] = Float.parseFloat(part.trim()) ;
            k=k+1 ;
        }
        System.out.println(this.records[t] + " " + this.targets[t] + " " + this.scores[t]);
        t=t+1;
    }
}
public static void main(String[] args) throws Exception, IOException {

    String s1, s2, s3 ;
    s1 = "./direc/" ;
    s2 = "file1.txt" ;
    s3 = s1+s2 ;
    System.out.println(s3);
    new Model(s2, s1);
}

}

4

3 に答える 3

0

解析を簡素化できます。内側のループをなくして、次のようにトリミングを避けることができます

String[] parts = line.split(", ");

this.records[t] = parts[0];
this.scores[t] = Float.parseFloat(parts[1]);
this.targets[t] = Integer.parseInt(parts[2]);

ここに 2 番目のコンマを入れるのを忘れたと思います

r1, 0.6, -1

また、 (ラッパーを返す)の代わりにプリミティブなint[]使用を使用しているため、不要なボックス化解除を回避できます。Integer.parseInt()Integer.valueOf()Integer

編集:次
のようにすべての配列を初期化する必要もあります

private String[] records = new String[100]; // initialization is MISSING!

あなたの場合、のサイズはArray入力データファイルの行数に依存するため、動的である必要があります。ArrayList動的に拡大する に切り替えることを検討してください。

private List<String> records = new ArrayList<String>();
private List<Integer> targets = new ArrayList<Integer>();
private List<Float> scores = new ArrayList<Float>();

コレクションを使用できるようにするには、ラッパー タイプを使用する必要があります。メソッドに戻りvalueOf()ます。

String[] parts = line.split(", ");

this.records.add(parts[0]);
this.scores.add(Float.valueOf(parts[1]));
this.targets.add(Integer.valueOf(parts[2]));
于 2013-06-21T17:54:54.080 に答える
0

ファイルの読み取りに使用したい簡単な方法は、 Scanner および File クラスを利用することです

これらの java.util.Scanner; をインポートすることから始めます。java.io.*;

次に、コードで (IOException をスローすることを忘れないでください): File filename = new File("filename.txt"); スキャナ fileScanner = new Scanner(filename);

配列を使用している場合は、配列を作成するために配列のサイズとそのタイプを知る必要があります。

テキストファイルは次のようになります。
1.0 2.7 6.3 8.4 8.6
2.0 9.4 9.1 3.0 4.2
3.4 7.7 8.3 3.2 1.0

ファイルにコンマを含めることができる場合は、スキャナーを作成した後に次の行を追加します。

fileScanner.useDelimiter(", ")

浮動小数点数や整数などの各行を含む 5 つの配列が必要な場合は、サイズ (ここでは 3) の 5 つの配列を作成し、このループを使用して各数値を追加します。

int rank = 0;
double[] r1 = new double[3];
.
.
.
double[] r5 = new double[3];
while(fileScanner.hasNext())
{
    if(fileScanner.hasNextDouble()) r1[rank] = fileScanner.nextDouble();
    if(fileScanner.hasNextDouble()) r2[rank] = fileScanner.nextDouble();
    if(fileScanner.hasNextDouble()) r3[rank] = fileScanner.nextDouble();
    if(fileScanner.hasNextDouble()) r4[rank] = fileScanner.nextDouble();
    if(fileScanner.hasNextDouble()) r5[rank] = fileScanner.nextDouble();
    rank++;
}
于 2013-06-21T17:58:37.910 に答える
0

if (k==1)ケースで中括弧を使用しない場合は、this.records[t]常に最後の部分が割り当てられます。コードは次のようになります。

        if (k==1) {
            System.out.println(part.trim());
            this.records[t] = part.trim() ;
        }

また、入力の 2 行目の 0.6 の後にカンマがありません。

于 2013-06-21T17:49:33.607 に答える