2015-10-22 47 views
1

這裏是我的代碼:如何統計dat文件中的字符?

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

public class BaseballStats 
{ 

    public static void main (String[] args) throws IOException 
    { 
     Scanner fileScan, lineScan; 
     String fileName; 

     Scanner scan = new Scanner(System.in); 

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

     while (fileScan.hasNext()) 
     { 
      fileName =fileScan.nextLine(); 
      System.out.println("Name: " + fileName); 

      lineScan = new Scanner (fileName); 
      lineScan.useDelimiter(","); 
      while (lineScan.hasNext()) 
      System.out.println(" "+lineScan.next()); 

      System.out.println(); 
     } 

    } 
} 

當您運行STATS.DAT文件

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,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 

我得到這樣的輸出:

Name: Willy Wonk,o,o,h,o,o,o,o,h,w,o,o,o,o,s,h,o,h 
Willy Wonk 
o 
o 
h 
o 
o 
o 
o 
h 
w 
o 
o 
o 
o 
s 
h 
o 
h 

Name: Shari Jones,h,o,o,s,s,h,o,o,o,h,o,o,o,o 
Shari Jones 
h 
o 
o 
s 
s 
h 
o 
o 
o 
h 
o 
o 
o 
o 

Name: Barry Bands,h,h,w,o,o,o,w,h,o,o,h,h,o,o,w,w,w,h,o,o 
Barry Bands 
h 
h 
w 
o 
o 
o 
w 
h 
o 
o 
h 
h 
o 
o 
w 
w 
w 
h 
o 
o 

Name: Sally Slugger,o,h,h,o,o,h,h,w 
Sally Slugger 
o 
h 
h 
o 
o 
h 
h 
w 

Name: Missy Lots,o,o,s,o,o,w,o,o,o 
Missy Lots 
o 
o 
s 
o 
o 
w 
o 
o 
o 

Name: Joe Jones,o,h,o,o,o,o,h,h,o,o,o,o,w,o,o,o,h,o,h,h 
Joe Jones 
o 
h 
o 
o 
o 
o 
h 
h 
o 
o 
o 
o 
w 
o 
o 
o 
h 
o 
h 
h 

Name: Larry Loop,w,s,o,o,o,h,o,o,h,s,o,o,o,h,h 
Larry Loop 
w 
s 
o 
o 
o 
h 
o 
o 
h 
s 
o 
o 
o 
h 
h 

Name: Sarah Swift,o,o,o,o,h,h,w,o,o,o 
Sarah Swift 
o 
o 
o 
o 
h 
h 
w 
o 
o 
o 

Name: Bill Bird,h,o,h,o,h,w,o,o,o,h,s,s,h,o,o,o,o,o,o 
Bill Bird 
h 
o 
h 
o 
h 
w 
o 
o 
o 
h 
s 
s 
h 
o 
o 
o 
o 
o 
o 

Name: Don Daring,o,o,h,h,o,o,h,o,h,o,o,o,o,o,o,h 
Don Daring 
o 
o 
h 
h 
o 
o 
h 
o 
h 
o 
o 
o 
o 
o 
o 
h 

Name: Jill Jet,o,s,s,h,o,o,h,h,o,o,o,h,o,h,w,o,o,h,h,o 
Jill Jet 
o 
s 
s 
h 
o 
o 
h 
h 
o 
o 
o 
h 
o 
h 
w 
o 
o 
h 
h 
o 

問: 現在我需要修改分析文件中一行的內部循環,以便打印每個部分而不是打印它(單獨)擊中,出局,散步和犧牲的次數。應爲每個玩家打印每個統計數據。

我遇到的問題是,我不知道如何使它計數特定的字符,我不知道如何使它不計數名稱中的字符。

如果有人能指導我,這將是偉大的。

+0

遇到逗號時開始計數。如果linescannext ==','開始計數字符,如果他們不是逗號 –

+2

謝謝大家誰回答。 – Aus

回答

0

這裏是一個全面實施的main()方法的使用方法,我會用我自己定的輸入數據。首先,我用逗號分割stats.dat文件的每一行。這給我們留下了一個數組,其中第一個元素是玩家的名字,剩下的元素是個人遊戲事件統計數據(例如out,walk)。接下來,我只需爲每個玩家統計統計數據,然後將其顯示到控制檯。

public static void main (String[] args) throws IOException { 
    Scanner fileScan; 
    String fileName; 

    Scanner scan = new Scanner(System.in); 

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

    while (fileScan.hasNext()) { 
     String currLine = fileScan.nextLine(); 
     String[] parts = currLine.trim().split(","); 

     String playerName = ""; 
     int hits=0, outs=0, walks=0, sacs=0; 

     if (parts.length > 0) { 
      playerName = parts[0]; 
     } 

     for (int i=1; i < parts.length; ++i) { 
      String stat = parts[i].trim(); 
      if (stat.equals("h")) { 
       ++hits; 
      } 
      else if (stat.equals("o")) { 
       ++outs; 
      } 
      else if (stat.equals("w")) { 
       ++walks; 
      } 
      else if (stat.equals("s")) { 
       ++sacs; 
      } 
     } 

     // display aggregated player stats to the console 
     System.out.println(playerName + ":"); 
     System.out.println("hits : " + hits); 
     System.out.println("outs : " + outs); 
     System.out.println("walks : " + walks); 
     System.out.println("sacs : " + sacs); 
    } 
} 
1

你只有幾種類型的字符數。你可以簡單地使用單獨的計數器爲每個:

 int wCount = 0; 
     int hCount = 0; 
     // ... 
     while (lineScan.hasNext()) { 
     switch (lineScan.next()) { 
      case 'w': wCount++; break; 
      // ... 
     } 
     } 
     // print the stats 
0

Scanner是一個重量級,所以用它來簡單地讀取線和分割線,是矯枉過正。改爲使用BufferedReader.readLine()String.split()。另外,不要預先聲明變量,只要有可能就聲明已初始化的地方。

調用split()會給你一個數組,你知道第一個元素是名字,所以你可以跳過它。

Scanner sysin = new Scanner(System.in); 
System.out.print("Enter the name of the input file: "); 
String fileName = sysin.nextLine(); 

try (BufferedReader fileIn = new BufferedReader(new FileReader(fileName))) { 
    for (String line; (line = fileIn.readLine()) != null;) { 
     String[] values = line.split(","); 
     int hits = 0, outs = 0, walks = 0, sacrifices = 0; 
     for (int i = 1; i < values.length; i++) 
      switch (values[i].charAt(0)) { 
       case 'h': hits++;  break; 
       case 'o': outs++;  break; 
       case 'w': walks++;  break; 
       case 's': sacrifices++; break; 
      } 
     System.out.println(values[0] + ": " + hits + " hits, " + 
               outs + " outs, " + 
               walks + " walks, " + 
               sacrifices + " sacrifices"); 
    } 
} 
0

爲此,我將簡單地使用一個Map來計算每一行上不同類型的數據。我會拆分數據,第一個項目總是人名,然後計算HashMap中的計數。使用這種方法添加不同類型的數據也是最容易的,因爲您只需在項目查找中添加一個類型即可完成。一個例子是,如果你想添加一個b的Bunt,那麼你只需要添加

itemLookup.put("b", "Bunt"); 

代碼,你就完成了。這是實現。

我只是創建一個方法來處理每一行。我假設用戶可以從他們想要的任何Feed中傳遞。

import java.util.HashMap; 
import java.util.Map; 

public class CountCharacters { 

    public static void main(String[] args) { 
     CountCharacters.processLine("Willy Wonk,o,o,h,o,o,o,o,h,w,o,o,o,o,s,h,o,h"); 
    } 

    static Map<String, String> itemLookup = new HashMap<>(); 

    static { 
     itemLookup.put("s", "Strike"); 
     itemLookup.put("w", "Walk"); 
     itemLookup.put("o", "Out"); 
     itemLookup.put("h", "Hit"); 

    } 

    public static void processLine(String currentLineReadFromFile) { 
     String inputData[] = currentLineReadFromFile.split(","); 
     HashMap<String, Integer> characterCount = new HashMap<>(); 

     for (String key : inputData) { 
      Integer value = characterCount.get(key); 
      if (value == null) { 
       characterCount.put(key, 1); 
      } else { 
       value++; 
       characterCount.put(key, value); 
      } 
     } 

     // show counted characters of all items collected 
     boolean firstItem = true; 
     for (String character : characterCount.keySet()) { 
      Integer value = characterCount.get(character); 
      if (firstItem == true) { 
       System.out.println(character); 
       firstItem = false; 
       continue; 
      } 
      System.out.println(itemLookup.get(character) + ":" + value); 
     } 

    } 
}