我在完成我的java类作业程序时遇到麻烦。它应该显示一个菜单,然后显示一个基于用户选择的子菜单,并从.txt
文件中读取所有信息。除了第一个... “企鹅栖息地的细节” 外,它适用于所有动物和栖息地选择。如果我将.tx
文件编辑为显示“ ..... habita”,则可以正常工作,因此删除T
会有所不同吗?
任何人都可以看一下并帮助我看看我所缺少的吗?还是提供解决方法以打印此选择?
这是我的代码和文本文件信息:
public class ZooInfo {
public void zooDetails(String fileName) throws IOException {
String fileInput = null;
ArrayList aList1 = new ArrayList();
int i = 0;
int choice = 0;
boolean loopExit = false;
FileInputStream fileByteStream = null; // File input stream
Scanner inFS = null; // Scanner object
Scanner scnr = new Scanner(System.in);
fileByteStream = new FileInputStream("C:\\Users\\jrbla\\Desktop\\IT-145\\" + fileName + ".txt"); //open file
inFS = new Scanner(fileByteStream);
while (inFS.hasNextLine() && loopExit == false) {
fileInput = inFS.nextLine();
if (fileInput.contains("Details on")) {
i += 1;
System.out.println(i + ". " + fileInput);
ArrayList aList2 = new ArrayList();
for (String retval : fileInput.split(" ")) {
aList2.add(retval);
}
String tempString = aList2.remove(2).toString();
aList1.add(tempString);
}
else {
if(choice != (i + 1)) { //while usr does not choose BACK
System.out.println("");
System.out.print("Choose details or enter " + (i + 1) + " to go back: ");
choice = scnr.nextInt();
System.out.println("");
if (choice <= i) {
String menuDetail = aList1.remove(choice - 1).toString();
outPut(fileName, menuDetail);
System.out.println("");
}
else if (choice == i + 1){
Main.mainMenu();
}
}
break;
}
}
fileByteStream.close(); // Done with file, so try to close it
}
public void outPut(String fileName, String menuDetail) throws IOException {
String fileInput = null;
String lowerFileInput = null;
String keeperAlert = "*****";
String edFileInput = "";
int fileNameLength = fileName.length();
String lowerFileName = fileName.toLowerCase().substring(0, fileNameLength - 1);
int menuDetailLength = menuDetail.length();
String lowerMenuDetail = menuDetail.toLowerCase().substring(0, menuDetailLength - 1);
boolean loopExit = false;
FileInputStream fileByteStream = null; // File input stream
Scanner inFS = null; // Scanner object
fileByteStream = new FileInputStream("C:\\Users\\jrbla\\Desktop\\IT-145\\" + fileName + ".txt"); //try to open file
inFS = new Scanner(fileByteStream);
while (inFS.hasNextLine() && loopExit == false) {
fileInput = inFS.nextLine();
lowerFileInput = fileInput.toLowerCase();
if (lowerFileInput.contains(lowerFileName) && lowerFileInput.contains(lowerMenuDetail)) {
do {
System.out.println(fileInput);
fileInput = inFS.nextLine();
if (fileInput.contains(keeperAlert)) { //look for ALERT trigger
edFileInput = fileInput.replace(keeperAlert, "!! ZOOKEEPER ALERT !! ");
JFrame popUP = new JFrame();
popUP.setAlwaysOnTop(true);
JOptionPane.showMessageDialog(popUP, edFileInput, "Warning", JOptionPane.WARNING_MESSAGE);
}
if (fileInput.isEmpty()) {
loopExit = true;
}
}
while (inFS.hasNextLine() && loopExit == false);
}
}
fileByteStream.close(); // Close file
}
}
Habitats.txt
Details on penguin habitat
Details on bird house
Details on aquarium
Habitat - Penguin
Temperature: Freezing
*****Food source: Fish in water running low
Cleanliness: Passed
Habitat - Bird
Temperature: Moderate
Food source: Natural from environment
Cleanliness: Passed
Habitat - Aquarium
Temperature: Varies with output temperature
Food source: Added daily
*****Cleanliness: Needs cleaning from algae
Selection 2 returns:
Habitat - Bird
Temperature: Moderate
Food source: Natural from environment
Cleanliness: Passed
Selection 3 returns:
Habitat - Aquarium
Temperature: Varies with output temperature
Food source: Added daily
*****Cleanliness: Needs cleaning from algae
but selection 1 returns incorrectly:
Details on penguin habitat
Details on bird house
Details on aquarium
答案 0 :(得分:0)
首先,这不是一个最低限度的工作示例。如果您的“ outPut”方法没有问题,则不需要包含它...或者您可以包含它的简化版本。它使代码的大小加倍,并且使人们更难以帮助您。
接下来,要查看您认为要执行的操作真的很困难,因为您根本没有注释代码,而且似乎没有计划,而您刚刚开始输入代码。考虑先编写一些伪代码,以便您至少可以说服自己,甚至可能使其他人相信自己的策略。
您需要使用更好的变量名。我们可以猜测您的意思,但这很烦人并且浪费更多时间。
例如:您使用“ retval”保存用空格分隔的字符串。如果您将变量命名为“ word”,那将更有意义。
类似地,您应该为这些名称使用更好的名称:
“ aList2”应为“ wordsOnLine”
“ tempString”应为“ habitatType”
“ aList1”应为“ habitatTypes”
我不确定您想要的“ i”是什么意思……显然,这是您在文本文件顶部声明的栖息地数量。您首先阅读了3条“ Details on”(详细信息)行,因此当您继续浏览其余数据时,我将始终为3。
这似乎对任何事情都没有用。总是3,所以当您深入研究方法时,您并没有执行您认为正在执行的操作...您只是在将用户的选择与3进行比较。
当用户输入choice = 1时,您进入第一个if(),原因是:
choice != (i + 1)
1 != (3+1)
1 != 4
true
然后进入下一个if(),因为:
choice <= i
1 <= 3
true
现在...您又在做奇怪的事情。您正在从aList1中删除元素,该元素应跟踪您的栖息地类型。执行此操作后,列表将变短,您将不知道列表中的内容或元素的含义。
您需要更好地计划策略。也许这是一次不错的尝试,但是您需要更加有条理。
答案 1 :(得分:0)
我找到了问题并解决了。问题是这一行:
如果(lowerFileInput.contains(lowerFileName)&& lowerFileInput.contains(lowerMenuDetail))
正在文本行中搜索(“动物”或“栖息地”)和“栖息地类型”(例如企鹅)。
第一行文本有“企鹅栖息地的细节”,因此它触发了打印行直到出现空白。我是这样解决的:
字符串redFlag =“ details”;
if (lowerFileInput.contains(lowerFileName)&& lowerFileInput.contains(lowerMenuDetail) && !lowerFileInput.contains(redFlag)) {
因此它跳过包含“详细信息”的第一行,并返回人居-企鹅的第一部分