这是我的第一篇文章,请原谅我,如果我发布的不正确。我有一项任务需要完成,但我无法让它正常工作。我使用的编译器是bluej。我需要做的是使用扫描仪读取文本文件并将用户输入与文本文件进行比较。如果输入字符串比较那么它应该打印出""该字在文本文件"上。不幸的是我无法让这个工作。我的代码读取文件,因为它打印到控制台但没有比较它发生。请看一下我的代码并给我一些指示。我一直在尝试使用.equals():
private boolean searchFromRecord(String recordName, String word) throws IOException
{
// Please write your code after this line
File file = new File(recordName);
Scanner scanner = new Scanner(file);
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
for(int i = 0; scanner.hasNextLine(); i++){
String compare = scanner.nextLine();
IO.outputln("word#" + i + ":" + compare);
}
scanner.close();
if (scanner.equals(word)){
return true;
} else{
return false;
}
}
return true;
}
这是我在控制台中输出的内容:
Input a word: IRON
AA 888
word#0:BULLET
word#1:1
word#2:AE 1688
word#3:CHEERS
word#4:GAMES
word#5:IRON MAN
word#6:WOLF
word#7:Testing
word#8:Wonderful
The word "IRON" is not in the record.
答案 0 :(得分:1)
以下是一些问题,以及它们出现问题的原因。关于如何修复它们的建议:
问题:在使用它的循环中关闭扫描程序会导致异常。 原因:在我们完成循环一次后,扫描仪将关闭。当我们再次循环时,由于循环使用扫描仪,将发生错误,这意味着扫描仪应该“打开”。 可能的解决方案:将scanner.close()
移至while循环之后。
问题:我们不应该在此方法结束时返回true
。 原因:我猜这个方法应该在找到单词时返回true
,否则返回false
。现在,获取此返回语句的唯一方法是在recordFile中不存在我们的单词;它应该返回false
。 可能的解决方案:在方法结束时返回false
。
问题:永远不会检查recordFile
中的第一行是否与word
原因相同: { {1}}将scanner.nextLine()
中的每一行作为字符串返回一次且仅返回一次。在你的代码中,它在while循环体的开头被调用一次,但不用于与word进行比较,之后,它在for循环中用于比较可能的解决方案:删除该行:recordFile
。
问题: System.out.println(scanner.nextLine());
可能始终返回scanner.equals(word)
。 原因: false
是scanner
,而Scanner
是word
,它们永远不应该相等。 可能的解决方案:将String
替换为scanner.equals(word)
问题: compare.equals(word)
实际上并未与每个word
进行比较。 原因:它在for循环之外。 可能的解决方案:将if else块移动到for循环体的末尾。
我认为不需要while循环。我强烈建议删除while循环,但保留正文。
问题:将if else块移动到for循环中,并在compare
上方意味着永远不会运行scanner.close()
。 原因:一旦执行了一个return语句,控制流立即退出该方法,并返回到调用该方法的位置,这使得返回语句后的代码无效。 可能的解决方案:而不是立即返回,声明某种布尔变量将存储返回值。在整个方法中修改返回值,然后在scanner.close()
除了这里提出的问题之外,还有很多其他方法可以解决这些问题。
我希望你觉得这很有帮助! :)
您的代码,经过重构以实现上述建议的解决方案:
scaner.close()
答案 1 :(得分:0)
首先,scanner
不是String
,它不会等于String
。其次,你要删除行 - scanner.nextLine()
获取下一行,然后打印它(但不要保存或比较它)。我想你想要更像这样的东西,
// eats and tosses input.
// System.out.println(scanner.nextLine());
String line = scanner.nextLine();
for(int i = 0; scanner.hasNextLine(); i++){
String compare = scanner.nextLine();
IO.outputln("word#" + i + ": " + compare + " to line: " + line);
if (line.contains(compare)){ // "IRON MAN" starts with "IRON", it doesn't equal IRON.
return true;
}
}
scanner.close();
return false; // <-- default.
答案 2 :(得分:0)
另一种风格是将整个文件读入String变量并在String中查找指定的String。
代码:
File file = new File("C:\\Users\\KICK\\Documents\\NetBeansProjects"
+ "\\SearchWordinFile\\src\\searchwordinfile\\words.txt");
String s="";
try(Scanner input = new Scanner(file)){
input.useDelimiter("\\A");
if (input.hasNext()) {
s = input.next();
}
}catch(Exception e){
System.out.println(e);
}
if(s.contains("IRON"))
System.out.println("I found IRON");
}
输出:
I found IRON
我的文件内容
BULLET
1
AE 1688
CHEERS
GAMES
IRON MAN
WOLF
Testing
Wonderful