我的导师给我的一项家庭作业是一项棒球统计计划。它从名为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 :(得分:1)
如果看起来你创建了一个Scanner
个实例太多了:
fileScan
一次读取一行并将其分配给行。lineScan
一次读取一行字段。lineScan
读取第一个令牌,然后创建第三个Scanner实例:statsScan
。您只需要从lineScan
读取所有标记,将第一个标记存储为人名,然后将后续标记作为统计信息处理,而不是这样做。我建议的另一件事是创建一个专用类来保存人名和统计数据,并在此类上实现toString()
以生成合理的字符串表示形式; e.g。
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类,然后将其打印出来; e.g。
Player player = new Player("Jim");
player.incrementNumHits();
// etc.
System.out.println(player);