Java 从文件中读取统计信息
我的教练给我的家庭作业之一是一个棒球统计程序。它从一个名为stats.dat的文件中读取,该文件包含棒球运动员的姓名以及他们击球时发生的事情的列表。它读取并打印出它们的名字以及它们的出局(o)、命中(h)、行走(w)和牺牲苍蝇(s)的数量。这是文件包含的内容:Java 从文件中读取统计信息,java,Java,我的教练给我的家庭作业之一是一个棒球统计程序。它从一个名为stats.dat的文件中读取,该文件包含棒球运动员的姓名以及他们击球时发生的事情的列表。它读取并打印出它们的名字以及它们的出局(o)、命中(h)、行走(w)和牺牲苍蝇(s)的数量。这是文件包含的内容: 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,
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中由/分隔的每个部分)。我有它,这样程序就可以打印出球员的名字,但我很难打印出他们的命中率、出局率、跑动率和牺牲果蝇的数量。到目前为止,它从一行中读取一个字符,然后下一个播放器打印出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);
}
}
}
import java.util.Scanner;
导入java.io.*;
公共类BaseballStats
{
公共静态void main(字符串[]args)引发IOException
{
int hit=0,walk=0,sac=0,out=0,length=0,wholeLength=0;
扫描仪文件扫描、lineScan、statScan;
字符串文件名、玩家名称、行、统计信息、玩家状态;
扫描仪扫描=新扫描仪(System.in);
System.out.println(“输入文件名:”);
fileName=scan.nextLine();
fileScan=新扫描仪(新文件(文件名));
while(fileScan.hasNext())
{
System.out.println();
line=(“播放器:+fileScan.nextLine());
全长度=线长度();
lineScan=新扫描仪(行);
lineScan.useDelimiter(“,”);
stats=lineScan.next();
statScan=新扫描仪(统计);
statScan.useDelimiter(“,”);
while(statScan.hasNext())
{
System.out.println(statScan.next());
长度=stats.length()-1;
for(int i=0;i
(我很难让代码中最后一条语句的最后一部分正确地显示在编辑器中,如果它看起来有点奇怪,我很抱歉)我一直在想到底出了什么问题,到目前为止我还没有弄清楚。有什么办法让我走上正轨吗?如果看起来您正在创建一个
扫描仪
实例太多:
- 您可以使用第一个扫描仪:
一次读取一行,并将其分配给该行fileScan
- 然后创建一个扫描器:
,一次读取一行字段lineScan
- 但是,您仅从
读取第一个标记,然后创建第三个扫描仪实例:lineScan
。与其这样做,您只需从statscan
读取所有标记,将第一个标记存储为此人的姓名,并将后续标记作为统计信息处理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()
,您只需创建并用统计数据填充您的播放器类,然后将其打印出来;e、 g
Player player = new Player("Jim");
player.incrementNumHits();
// etc.
System.out.println(player);
尝试在for循环之前打印统计数据,您可能会得到一个提示。就我个人而言,我会使用“line.split(“,””)并处理生成的数组,而不是使用扫描器。我不明白您所说的“用统计数据填充您的玩家类”是什么意思。根据我的理解(这是非常低的),参数(例如,第二个示例中的“Jim”)必须与新操作符和对象在同一行。我的意思是,您定义了一个类:Player,它充当播放器名称和相关统计信息的容器:hit、out等。这允许您定义相关的行为(例如incrementNumHits(),toString())。我说的“填充你的类”是指在读取文件的每一行时,你创建一个新的Player实例,并在上面调用相应的incrementXXX方法,以便在读取时整理统计数据。