使用 BufferedReader 每行读取多个数据值
Reading multiple data values per line using BufferedReader
我正在制作一个从名为 playoffs.txt 的文件中读取数据的程序。每一行都有一个队名、分数和分区,每一个都用冒号分隔,像这样:
Panthers:0:Atlantic
Lightning:0:Atlantic
Red Wings:0:Atlantic
我想要 运行 一个 for 循环,为每个团队打印出这个:
Team: Panthers
Series Score: 0
Division: Atlantic
但是,我无法弄清楚如何分隔每一行的值,因为 readLine 似乎打印出整行。这是我的方法:
private static void series(String team1) throws FileNotFoundException, IOException{
BufferedReader in = new BufferedReader(new FileReader("playoffs.txt"));
String[] team = new String[0];
int[] score = new int[0];
String[] division = new String[0];
String s;
int j = 0;
while((s = in.readLine()) != null){
String[] var = s.split(":");
team[j] = in.readLine(var[0]);
score[j] = in.read();
division[j] = in.read();
cout.println(team[j]);
cout.println(score[j]);
cout.println(division[j]);
j++;
}
}
我是 Java 的新手,我在另一个与我的问题类似的 Whosebug 问题中发现 s.split 行,运行 是一个错误 "String cannot be converted to boolean." 我也对 readLine() 和 read() 之间的区别感到困惑。任何帮助我指明正确方向以分别阅读每个值的任何帮助都将不胜感激。
尝试
String[] var = s.split(":");
team[j] = var[0];
score[j] = var[1];
division[j] = var[2];
但您应该将 team
初始化为足够大以容纳您的数据。
我个人会使用 ArrayList
考虑创建一个名为 Team
的新 class,它具有团队名称、得分和组别。您可以创建一个 ArrayList <Team> = new ArrayList <Team> ();
您正确拆分了“:”符号,returns 和 String[]
。
您不需要调用 in.readLIne(var[0])
。 String[]
中已有值。只需将它们分配给您的变量:
while((s = in.readLine()) != null){
String[] var = s.split(":");
team[j] = var[0];
score[j] = var[1];
division[j] = var[2]
cout.println(team[j]);
cout.println(score[j]);
cout.println(division[j]);
j++;
}
这解决了您的一个问题。但是,由于您试图为每个条目存储多个值,因此最好使用一个容器 class 来表示您拥有的数据。然后,您可以创建容器的新实例 class 并覆盖 toString() 方法以在收到所有输入后打印每个容器的内容。
尝试添加 GameResult class(或称其为其他名称):
public class GameResult{
String team;
int score;
String division;
public GameResult(String team, int score, String division){
this.team = team;
this.score = score;
this.division = division;
}
public String getTeam(){
return team;
}
public int getScore(){
return score;
}
public String getDivision(){
return division;
}
@Override
public String toString(){
StringBuilder sb = new StringBuilder();
sb.append("Team: ").append(team).append("\n");
sb.append("Score: ").append(score).append("\n");
sb.append("Division: ").append(division).append("\n");
return sb.toString();
}
}
现在您可以使用新的 class 并为列表中的每一行存储稍后打印结果:
private static void series(String team1) throws FileNotFoundException, IOException{
BufferedReader in = new BufferedReader(new FileReader("playoffs.txt"));
List<GameResult> results = new ArrayList<>();
String s;
while((s = in.readLine()) != null){
String[] var = s.split(":");
GameResult result = new GameResult(var[0], var[1], var[2]);
}
//Print out the results
for(GameResult aResult: results){
System.out.print(aResult);
}
}
我正在制作一个从名为 playoffs.txt 的文件中读取数据的程序。每一行都有一个队名、分数和分区,每一个都用冒号分隔,像这样:
Panthers:0:Atlantic
Lightning:0:Atlantic
Red Wings:0:Atlantic
我想要 运行 一个 for 循环,为每个团队打印出这个:
Team: Panthers
Series Score: 0
Division: Atlantic
但是,我无法弄清楚如何分隔每一行的值,因为 readLine 似乎打印出整行。这是我的方法:
private static void series(String team1) throws FileNotFoundException, IOException{
BufferedReader in = new BufferedReader(new FileReader("playoffs.txt"));
String[] team = new String[0];
int[] score = new int[0];
String[] division = new String[0];
String s;
int j = 0;
while((s = in.readLine()) != null){
String[] var = s.split(":");
team[j] = in.readLine(var[0]);
score[j] = in.read();
division[j] = in.read();
cout.println(team[j]);
cout.println(score[j]);
cout.println(division[j]);
j++;
}
}
我是 Java 的新手,我在另一个与我的问题类似的 Whosebug 问题中发现 s.split 行,运行 是一个错误 "String cannot be converted to boolean." 我也对 readLine() 和 read() 之间的区别感到困惑。任何帮助我指明正确方向以分别阅读每个值的任何帮助都将不胜感激。
尝试
String[] var = s.split(":");
team[j] = var[0];
score[j] = var[1];
division[j] = var[2];
但您应该将 team
初始化为足够大以容纳您的数据。
我个人会使用 ArrayList
考虑创建一个名为 Team
的新 class,它具有团队名称、得分和组别。您可以创建一个 ArrayList <Team> = new ArrayList <Team> ();
您正确拆分了“:”符号,returns 和 String[]
。
您不需要调用 in.readLIne(var[0])
。 String[]
中已有值。只需将它们分配给您的变量:
while((s = in.readLine()) != null){
String[] var = s.split(":");
team[j] = var[0];
score[j] = var[1];
division[j] = var[2]
cout.println(team[j]);
cout.println(score[j]);
cout.println(division[j]);
j++;
}
这解决了您的一个问题。但是,由于您试图为每个条目存储多个值,因此最好使用一个容器 class 来表示您拥有的数据。然后,您可以创建容器的新实例 class 并覆盖 toString() 方法以在收到所有输入后打印每个容器的内容。
尝试添加 GameResult class(或称其为其他名称):
public class GameResult{
String team;
int score;
String division;
public GameResult(String team, int score, String division){
this.team = team;
this.score = score;
this.division = division;
}
public String getTeam(){
return team;
}
public int getScore(){
return score;
}
public String getDivision(){
return division;
}
@Override
public String toString(){
StringBuilder sb = new StringBuilder();
sb.append("Team: ").append(team).append("\n");
sb.append("Score: ").append(score).append("\n");
sb.append("Division: ").append(division).append("\n");
return sb.toString();
}
}
现在您可以使用新的 class 并为列表中的每一行存储稍后打印结果:
private static void series(String team1) throws FileNotFoundException, IOException{
BufferedReader in = new BufferedReader(new FileReader("playoffs.txt"));
List<GameResult> results = new ArrayList<>();
String s;
while((s = in.readLine()) != null){
String[] var = s.split(":");
GameResult result = new GameResult(var[0], var[1], var[2]);
}
//Print out the results
for(GameResult aResult: results){
System.out.print(aResult);
}
}