这是我的代码:
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 :(得分:1)
您只需计算几种类型的字符。您可以简单地为每个计数器使用一个单独的计数器:
int wCount = 0;
int hCount = 0;
// ...
while (lineScan.hasNext()) {
switch (lineScan.next()) {
case 'w': wCount++; break;
// ...
}
}
// print the stats
答案 1 :(得分: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);
}
}
答案 2 :(得分: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");
}
}
答案 3 :(得分:0)
为此,我只需使用Map来计算每行的不同类型的数据。我将数据拆分,第一项始终是人名,然后计算HashMap中的计数。使用此方法添加不同类型的数据也是最简单的,因为您需要做的就是在项目查找中添加一个类型,然后就完成了。一个例子是如果你想为Bunt添加一个b,那么你只需要添加
itemLookup.put("b", "Bunt");
代码,你就完成了。这是实施。
我只是创建了一个处理每一行的方法。我假设用户可以从他们想要的任何提要中传入该行。
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);
}
}
}