2016-04-13 8 views
0

私は、playoffs.txtというファイルからデータを読み取るプログラムを作成しています。BufferedReaderを使用して1行に複数のデータ値を読み取る

Panthers:0:Atlantic 
Lightning:0:Atlantic 
Red Wings:0:Atlantic 

私は各チームのためにこれをプリントアウトforループを実行したい:各行はそうのように、それぞれがコロンで区切られ、チーム名、スコア、および部門を持っている

Team: Panthers 
Series Score: 0 
Division: Atlantic 

しかし、 readLineは行全体を印刷するように見えるので、各行の値をどのように区切るかを考え出すのが難しいです。ここに私の方法です:

private static void series(String team1) throws FileNotFoundException, IOException{ 
    BufferedReader in = new BufferedReader(new FileReader("playoffs.txt")); 

    String[] team = new String[0]; 
    int[] score = new int[0]; 
    String[] division = new String[0]; 
    String s; 
    int j = 0; 
    while((s = in.readLine()) != null){ 
     String[] var = s.split(":"); 
     team[j] = in.readLine(var[0]); 
     score[j] = in.read(); 
     division[j] = in.read(); 
     cout.println(team[j]); 
     cout.println(score[j]); 
     cout.println(division[j]); 
     j++; 
    } 
} 

私は、Javaと私は私の質問に類似していた別のStackOverflowの質問で見つかったs.splitラインに新たなんだ、それは文字列がブール値に変換することができません」というエラーが実行されます。 "私はまた、readLine()とread()の違いについて混乱しています。適切な方向に私を指差して、それぞれの価値を別々に読むことができれば幸いです。

+0

配列を長さ「0」に初期化しようとしています。つまり、0以上の要素を保持しません。 'ArrayList'クラスのように動的に割り当てられた配列を使うことをお勧めします。 –

答えて

3

String[] var = s.split(":"); 
    team[j] = var[0]; 
    score[j] = var[1]; 
    division[j] = var[2]; 

を試していますが、あなたのteamがあなたのデータを保持するのに十分な大きさする初期化しなければなりません。
私は個人的にArrayListを使用します

Teamという新しいクラスを作成することを検討してください。チーム名、スコア、および除算があります。 ArrayList <Team> = new ArrayList <Team>();

+0

これは機能しますが、すべてのチーム名が出力されます。ループの最後に 'j ++;'を追加するとエラーが発生します: 'java.lang.ArrayIndexOutOfBoundsException'。イテレーションごとにチームを1つだけ印刷する方法はありますか? – watercolour

+0

気にしないで、私は何をしたのか分かりませんが、今は動作します。ありがとうございました! – watercolour

1

「:」記号を正しく分割すると、が返されます。 in.readLIne(var[0])に電話する必要はありません。既に値はString[]です。変数に割り当てるだけです:

while((s = in.readLine()) != null){ 
    String[] var = s.split(":"); 
    team[j] = var[0]; 
    score[j] = var[1]; 
    division[j] = var[2] 
    cout.println(team[j]); 
    cout.println(score[j]); 
    cout.println(division[j]); 
    j++; 
} 

これは問題の1つを解決します。ただし、エントリごとに複数の値を格納しようとしているので、持つデータを表すコンテナクラスを使用する方がよいでしょう。その後、コンテナクラスの新しいインスタンスを作成し、toString()メソッドをオーバーライドして、すべての入力が受け取られた後にそれぞれの内容を出力することができます。

GameResultクラスを追加してみてください(または他の何かそれを呼び出す):

public class GameResult{ 
    String team; 
    int score; 
    String division; 

    public GameResult(String team, int score, String division){ 
     this.team = team; 
     this.score = score; 
     this.division = division; 
    } 

    public String getTeam(){ 
     return team; 
    } 

    public int getScore(){ 
     return score; 
    } 

    public String getDivision(){ 
     return division; 
    } 

    @Override 
    public String toString(){ 
     StringBuilder sb = new StringBuilder(); 
     sb.append("Team: ").append(team).append("\n"); 
     sb.append("Score: ").append(score).append("\n"); 
     sb.append("Division: ").append(division).append("\n"); 

     return sb.toString(); 
    } 
} 

今、あなたは新しいクラスを使用して、後で結果を印刷するには、リスト内の各ラインストアのことができます。

private static void series(String team1) throws FileNotFoundException, IOException{ 
    BufferedReader in = new BufferedReader(new FileReader("playoffs.txt")); 
    List<GameResult> results = new ArrayList<>(); 
    String s; 

    while((s = in.readLine()) != null){ 
     String[] var = s.split(":"); 
     GameResult result = new GameResult(var[0], var[1], var[2]); 

    } 

    //Print out the results 
    for(GameResult aResult: results){ 
     System.out.print(aResult); 
    } 
} 
関連する問題