提问人:JustNeedHelp 提问时间:8/4/2023 最后编辑:JustNeedHelp 更新时间:8/4/2023 访问量:50
如何在文件中查找特定系列的输入并打印出结果 [已关闭]
How to find a specific series of inputs in a file and print out results [closed]
问:
我正在尝试创建一些东西,这基本上是我在另一个测试中搜索某个人结果的一种方式,而不必滚动浏览所有内容。它需要输入,例如我需要找到的任何“学生”的姓名、年龄和性别,然后它应该找到确切的学生并在下面打印结果。
我设置了文件,以便当有人参加测试时,他们的结果会像这样打印:
姓名
年龄
性别
结果
我希望我的代码找到输入的姓名,然后查看姓名下方的年龄是否与输入匹配,然后查看下方的性别是否与输入匹配。如果所有这些都是正确的,它应该打印出结果。
//These ask for the name, age, and gender
Scanner enterName = new Scanner(System.in);
System.out.println("Please enter Student's full name below.");
var stuName = enterName.nextLine();
Scanner enterAge = new Scanner(System.in);
System.out.println("Please enter Student's age below.");
var stuAge = enterAge.nextInt();
Scanner enterGender = new Scanner(System.in);
System.out.println("Please enter Student's gender below (Female or Male).");
var stuGender = enterGender.nextLine();
//These scanners search for the information
Scanner usersName = new Scanner(new File("Example.txt"));
Scanner usersAge = new Scanner(new File("Example.txt"));
Scanner usersGender = new Scanner(new File("Example.txt"));
Scanner usersScore = new Scanner(new File("Example.txt"));
var searchName = usersName.nextLine();
//This shoulder search for the information and come back true if it's found
try {
while (usersName.hasNextLine()) {
searchName = usersName.nextLine();
if (searchName.equals(stuName)) {
break;
}
}
} catch (Exception e) {
if (!usersName.equals(stuName)) {
System.out.println("Student not found");
}
}
var searchAge = usersName.nextLine();
if(!searchAge.equals(stuAge)) {
System.out.println("Student not found");
System.exit(1);
}
var searchGen = usersGender.nextLine();
if(!searchGen.equals(stuGender)) {
System.out.println("Student not found");
System.exit(1);
}
if(searchName.equals(stuName) && usersAge.equals (stuAge) && usersGender.equals(stuGender)) {
var searchScore = usersScore.nextDouble();
System.out.println("The student " + stuName + "'s score was: " + searchScore);
System.exit(1);
} else {
System.out.println("Student not found");
System.exit(1);
}
在途中的某个地方,它丢失了,它总是打印“找不到学生”,即使我知道这些特定结果在文件中。
示例文件
Test
1
Female
93.0%
Test
2
Female
97.0%
Test
3
Female
100.0%
答:
1赞
Eritrean
8/4/2023
#1
您不需要多个扫描仪来获取用户输入。您可以重复使用一个。这同样适用于在文件中搜索,您只需要一个扫描仪。除此之外,您的文件似乎格式良好,因此您可以使用该方法并传递可以从用户输入中构建的模式。像下面这样的东西应该可以帮助你开始。注意:该示例没有错误处理,也没有不区分大小写的搜索。您可以自己改进Scanner.findAll
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.regex.MatchResult;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) throws FileNotFoundException {
Scanner userInput = new Scanner(System.in);
System.out.println("Please enter Student's full name below.");
var stuName = userInput.nextLine();
System.out.println("Please enter Student's age below.");
var stuAge = userInput.nextInt();
userInput.nextLine(); //this is not an oversight but intentional and necessary to be able to read the next input.
System.out.println("Please enter Student's gender below (Female or Male).");
var stuGender = userInput.nextLine();
Scanner fileContent = new Scanner(new File("Example.txt"));
//construct pattern from user input and regex for percentage
Pattern pattern = Pattern.compile(stuName + "\n" + stuAge + "\n" + stuGender + "\n" + "\\d+(?:\\.\\d+)?%");
//use findAll method and return first match if present
fileContent.findAll(pattern)
.map(MatchResult::group)
.findFirst()
.ifPresentOrElse(
(value) -> System.out.println("Found matching result: \n" + value),
() -> System.out.println("No matching result found"));
}
}
编辑:
什么是“\n\\d+(?:\\.\\d+)?%”,它与模式有什么关系?
我已经从正则表达式中分离出新的行字符,以减少混淆,并将其转换为:
`"\n" + "\\d+(?:\\.\\d+)?%"`
该部件是与标记百分比匹配的正则表达式。\\d+(?:\\.\\d+)?%
\\d+
匹配一个或多个数字(?:\\.\\d+)?
optionaly 后跟一个点和点后跟一个或多个数字%
匹配百分比字符
因此,可能的匹配可能如下所示,其中 x 是任何数字
x%
例 7%xx%
例 27%xx.x%
例如 97.4%xx.xx%
例 84.32%
``
评论
0赞
JustNeedHelp
8/4/2023
什么是“\n\\d+(?:\\.\\d+)?%”,它与模式有什么关系?
1赞
Eritrean
8/4/2023
这是为了匹配结果/成绩线。我会对答案进行解释。
0赞
JustNeedHelp
8/4/2023
它按预期工作,但仍然始终不输出匹配的结果。输入“测试”“3”和“女性”后,尽管信息在文件中,但它仍会打印“未找到匹配结果”。我尝试改变一些东西,但没有任何运气。
1赞
Eritrean
8/4/2023
对于给出的示例文件,我无法重现您的问题。我得到了所有三个结果。请使用您当前使用的代码更新您的问题,并检查该文件的格式是否真的与您的示例相同
1赞
JustNeedHelp
8/4/2023
我正在使用示例文件,但仍然一无所获。这很奇怪......我会再检查一下,看看我是否遗漏了什么。谢谢你的帮助。
评论