java - 是否可以在不声明多个扫描仪的情况下多次使用文件扫描仪?
问题描述
我正在为我的即兴剧院制作一个程序,该程序将帮助我们挑选出我们在晚上演出的游戏,而不会与任何其他游戏的风格重叠。我遇到了一个问题。在下面的代码中,Scanner scWU 读取一个包含即兴游戏名称的 .txt 文件,而 Scanner sc 是一个普通的 System.in 扫描器。
我在下面粘贴了我的两种方法。getWarmUp()返回字符串 (game) 在它被认为是某个类别(在本例中为热身游戏类别)的可行游戏之后。isWarmUp()读取warmupgames.txt文件,查看进入的游戏是否确实是热身游戏
我的问题是:如果用户未能输入游戏名称(并且 isWarmUp 返回 false),我该如何重新启动该方法或重置文件顶部的 scWU 扫描仪?我必须声明多个扫描仪吗?或者在用户第一次正确进入游戏失败后,我可以轻松地让相同的扫描仪再次扫描文件吗?(注意:我知道第 25 行的 while 循环是一个无限循环。这是我希望解决这个问题的地方)
我将回答有关我的代码的任何困惑
public static String getWarmUp(Scanner sc, Scanner scWU)
{
String prompt = "What warm-up game will you choose? \n" +
"(NOTE: Type game as it's written on the board. Caps and symbols don't matter.)\n" +
"> ";
System.out.print(prompt);
String game = sc.nextLine();
//This while loop is infinite. This is where I'm hoping to somehow allow the scanner to reset and
//read again on a failed input
while(!warmUp)
{
warmUp = isWarmUp(scWU, game);
if(!warmUp)
System.out.println("That's not a warm-up game, try again.");
}
return game;
}
public static boolean isWarmUp(Scanner scWU1, String game)
{
int lineNum = 0;
while(scWU1.hasNextLine())
{
String line = scWU1.nextLine();
lineNum++;
if(line.equalsIgnoreCase(game))
return true;
}
return false;
解决方案
这就是我的意思。大概你现在正在使用这样的getWarmUp
东西:
String gamesFileName = "theGamesFile.txt");
Scanner in = new Scanner(System.in);
Scanner games = new Scanner(gamesFileName);
getWarmUp(in, games);
但是getWarmUp
(或者,更确切地说,isWarmUp
调用getWarmUp
)可能需要从头开始重新读取文件。它可以做到这一点的唯一方法是创建一个新的Scanner
. 您需要文件名才能创建新的Scanner
. 因此,getWarmUp
将文件名作为参数而不是打开的Scanner
:
public static String getWarmUp(Scanner sc, String gamesFn)
{
boolean warmUp = false;
while(!warmUp)
{
String prompt = "What warm-up game will you choose? \n" +
"(NOTE: Type game as it's written on the board. Caps and symbols don't matter.)\n" +
"> ";
System.out.print(prompt);
String game = sc.nextLine();
Scanner scWU = new Scanner(gamesFn);
warmUp = isWarmUp(scWU, game);
scWU.close();
if(!warmUp)
System.out.println("That's not a warm-up game, try again.");
}
return game;
}
然后像这样调用它:
String gamesFileName = "theGamesFile.txt");
Scanner in = new Scanner(System.in);
getWarmUp(in, gamesFileName);
推荐阅读
- sql - CAST as TIMESTAMP 不适用于某些字符串格式
- javascript - 创建包含图像表格的 PDF 的最简单方法是什么?(HTML/JS)
- arrays - 使用数组中的内容按下按钮时更改标签文本
- javascript - 有没有办法使用javascript向每个表行添加一个
- javascript - 使用 jinja2 仅渲染 HTML
- php - 通过比较时间设置每日限制()
- ios - 刷新后保持表格单元格删除而不触及数据库中的帖子
- algorithm - 是否可以从 (a,b) 移动到 (c,d)
- android - 获取 METHOD GET JSON 改造的问题
- microsoft-graph-api - /security/alerts 未从 Azure 身份保护 (IPC) 返回