Java 从文件中读取统计信息

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,

我的教练给我的家庭作业之一是一个棒球统计程序。它从一个名为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,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方法,以便在读取时整理统计数据。