2011-10-19 5 views
0

私のインストラクターが私に与えた宿題の1つは野球統計プログラムでした。これはstats.datというファイルから読み込まれます。このファイルには野球選手の名前の名前とバットにあったときの出来事のリストが含まれています。それは、彼らの名前とアウト(o)、ヒット(h)、散歩(w)、およびそれらを持っているハエの量を読み取り、プリントします。これは、ファイルが含まれているものです:ファイルから統計を読む

Willy Wonk,o,o,h,o,o,o,o,h,w,o,o,o,o,s,h,o,h 
Shari Jones,h,o,o,s,s,h,o,o,o,h,o,o,o 
Barry Bands,h,h,w,o,o,o,w,h,o,o,h,h,o,o,w,w,w,h,o,o 
Sally Slugger,o,h,h,o,o,h,h,w 
Missy Lots,o,o,s,o,o,w,o,o,o 
Joe Jones,o,h,o,o,o,o,h,h,o,o,o,o,w,o,o,o,h,o,h,h 
Larry Loop,w,s,o,o,o,h,o,o,h,s,o,o,o,h,h 
Sarah Swift,o,o,o,o,h,h,w,o,o,o 
Bill Bird,h,o,h,o,h,w,o,o,o,h,s,s,h,o,o,o,o,o,o 
Don Daring,o,o,h,h,o,o,h,o,h,o,o,o,o,o,o,h 
Jill Jet,o,s,s,h,o,o,h,h,o,o,o,h,o,h,w,o,o,h,h,o 

は、これまでのところ、私はかなりの各行が何をしているかを理解していないにもかかわらず、ダウン基本的な考え方を持っている(私は私のクラスがある本の中で、プログラムのいくつかのコードを修正しました読み込みは、テキストファイルにあるURLを印刷し、/で区切られたURLの各部分を出力します。私はプログラムでプレイヤーの名前を印刷するようにしていますが、ヒット、アウト、ウォーク、そしてハエを犠牲にする方法を印刷する方法がわかりません。私は(

import java.util.Scanner; 
import java.io.*; 

public class BaseballStats 
{ 
public static void main(String [] args) throws IOException 
{ 
    int hit = 0, walk = 0, sac = 0, out = 0, length = 0, wholeLength = 0; 
    Scanner fileScan, lineScan, statScan; 
    String fileName, playerName, line, stats, playerStats; 
    Scanner scan = new Scanner(System.in); 

    System.out.println("Enter the name of the file: "); 
    fileName = scan.nextLine(); 
    fileScan = new Scanner(new File(fileName)); 

    while (fileScan.hasNext()) 
    { 
    System.out.println(); 
    line = ("Player: " + fileScan.nextLine()); 
    wholeLength = line.length(); 

    lineScan = new Scanner(line); 
    lineScan.useDelimiter(","); 

    stats = lineScan.next(); 
    statScan = new Scanner(stats); 
    statScan.useDelimiter(","); 


    while (statScan.hasNext()) 
    { 
    System.out.println(statScan.next()); 
    length = stats.length() - 1; 


    for (int i = 0; i < length; i++) 
    { 
     if (stats.charAt(i) == 'h') 
     hit++; 
     else if (stats.charAt(i) == 'o') 
     out++; 
     else if (stats.charAt(i) == 'w') 
     walk++; 
     else if (stats.charAt(i) == 's') 
     sac++; 
    } 
    } 
    System.out.println("Hits: " + hit + "\nOuts: " + out + "\nWalks: " + walk +    "\nSacrifice flies: " + sac); 
    } 
} 
} 

:これまでのところ、それはラインのうち1つの文字を読んでいる、それは次のプレイヤーにダウンしてから2、3出力し、などここに私はこれまでのところ、それを持っているコードです私のコードの最後の文の最後の部分がエディタに正しく表示されるのは苦労します。私は何が間違っているのか疑問に思っています。正しい軌道に乗せてくれるものはありますか?

+0

forループの前に統計情報を印刷してください。ヒントが表示されることがあります。 – Rickard

+0

個人的には、私は 'line.split( "、")'を使用し、結果の配列で動作します。 –

答えて

1

あなたのように見えますが、あまりにも多くの1つのScannerのインスタンスを作成する場合:一度に1行を読み込み、行にこれを割り当てることfileScan

  • あなたが最初のスキャナを使用しています。
  • 次に、スキャナを作成して、lineScanを作成して、一度に1つのフィールドだけを読み取るようにします。
  • ただし、最初のトークンをlineScanから読み取ってから、3番目のScannerインスタンス:statsScanを作成します。これを行うのではなく、lineScanからすべてのトークンを読み、最初のものを人の名前として保存し、後続のトークンを統計として処理するだけです。

人の名前と統計情報を保持する専用のクラスを作成し、このクラスにtoString()を実装して、わかりやすい文字列表現を生成することをお勧めします。例えばあなたは、単に作成や統計でプレイヤーのクラスを移入し、それをプリントアウトする必要がtoString()を実装することにより

public class Player { 
    private final String name; 
    private int hit, out, walk, sac; 

    public int getNumHits() { 
    return hit; 
    } 

    public int incrementNumHits() { 
    return ++hit; 
    } 

    // TODO: Implement other getter and increment methods. 

    public String toString() { 
    return String.format("%s. Hits: %d, Outs: %d, Walks: %d, Sacrifice flies: %d", 
     name, hit, out, walk, sac); 
    } 
} 

。例えば

Player player = new Player("Jim"); 
player.incrementNumHits(); 
// etc. 
System.out.println(player); 
+0

「あなたのプレイヤークラスに統計情報を入力してください」という意味が得られません。私の理解から(非常に低い)、パラメータ(例えば、2番目の例では "Jim")は、new演算子とオブジェクトと同じ行になければなりません。 – mooles

+0

私は、あなたがクラスを定義していることを意味しています:プレイヤーはプレーヤー名と関連する統計情報のコンテナとして機能します:hit、outなどこれにより、関連する動作を定義できます(例:incrementNumHits()、toString ))。 「あなたのクラスを作成する」とは、ファイルの新しい行を読み込むたびに、Playerの新しいインスタンスを作成し、適切なincrementXXXメソッドを呼び出して、読み込んだときに統計を照合するということです。 – Adamski

関連する問題