我正在尝试创建一种基本上可以让我在另一项测试中搜索某个人的结果而无需滚动浏览所有内容的方法。它需要输入,例如我需要找到的任何“学生”的姓名、年龄和性别,然后它应该找到确切的学生并在下面打印结果。
我设置了文件,以便当有人参加测试时,他们的结果会像这样打印:
姓名
年龄
性别
结果
我希望我的代码找到输入的姓名,然后查看姓名下方的年龄是否与输入匹配,然后查看姓名下方的性别是否与输入匹配。如果所有这些都正确,它应该打印出结果。
//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%
您不需要多个扫描仪来获取用户输入。您可以重复使用一个。文件搜索也是如此,您只需要一台扫描仪。除此之外,您的文件似乎格式良好,因此您可以使用
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"));
}
}
编辑:
什么是“ \d+(?:\.\d+)?%" 以及它与模式有何关系?
我已将新行字符与正则表达式分开,以减少混淆并将其更改为:
`"\n" + "\\d+(?:\\.\\d+)?%"`
\\d+(?:\\.\\d+)?%
部分是匹配标记百分比的正则表达式。
\\d+
匹配一位或多位数字(?:\\.\\d+)?
可选后跟一个点以及点后的一位或多位数字%
匹配百分号字符因此,可能的匹配可能类似于,其中 x 是任意数字
x%
例如。 7%xx%
例如。 27%xx.x%
例如。 97.4%xx.xx%
例如。 84.32%``