2011-10-19 111 views
0

我的導師給我的一項家庭作業是棒球統計程序。它從名爲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的每個部分。我擁有它,這樣程序就可以打印出玩家的名字,但是我很難理解如何打印出他們得到的蒼蠅的命中,走出,散步的數量。到目前爲止,它的閱讀1個字符出列,然後下降到下一個玩家,並打印出2,然後3,等等。這裏是我有這麼遠代碼:

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); 
    } 
} 
} 

(我很難讓我的代碼中最後一個語句的最後部分在編輯器中正確顯示,對不起,如果看起來有點奇怪)我一直在想知道什麼是錯誤的,至今我都弄不清楚。有什麼能讓我走上正軌嗎?

+0

嘗試在for循環之前打印統計信息,您可能會收到提示。 – Rickard

+0

就我個人而言,我會使用'line.split(「,」)'並使用結果數組,而不是混淆掃描儀。 –

回答

1

如果看起來像你創建一個Scanner實例太多:

  • 可以使用第一掃描儀:fileScan在一次讀取一行,並指定這行。
  • 然後,您創建一個掃描儀:lineScan以逐行讀取一行字段。
  • 但是,您只能從lineScan中讀取第一個令牌,然後創建第三個掃描程序實例:statsScan。您只需讀取lineScan中的所有令牌,將第一個存儲爲該人員的姓名並將後續令牌處理爲統計數據,而不是執行此操作。我建議

的另一件事是創建一個專用的類來保存這個人的名字和統計,並在這個類來產生一個合理的字符串表示實施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); 
    } 
} 

通過實施toString()你只需要創建和使用統計數據填充您的播放器類,然後把它打印出來;例如

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

我不明白你的意思是「用統計數據填充你的球員類」。根據我的理解(這很低),參數(例如,第二個示例中的「Jim」)必須與新運算符和對象位於同一行。 – mooles

+0

我的意思是你正在定義一個類:Player,它作爲播放器名稱和相關統計的容器:hit,out等。這允許你定義相關的行爲(例如incrementNumHits(),toString( ))。通過「填充你的班級」,我的意思是,在閱讀文件的每一行後,你將創建一個新的Player實例,並在它上面調用相應的incrementXXX方法來整理統計數據。 – Adamski