如何在文件中查找特定系列的输入并打印出结果 [已关闭]

How to find a specific series of inputs in a file and print out results [closed]

提问人:JustNeedHelp 提问时间:8/4/2023 最后编辑:JustNeedHelp 更新时间:8/4/2023 访问量:50

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

4个月前关闭。

我正在尝试创建一些东西,这基本上是我在另一个测试中搜索某个人结果的一种方式,而不必滚动浏览所有内容。它需要输入,例如我需要找到的任何“学生”的姓名、年龄和性别,然后它应该找到确切的学生并在下面打印结果。

我设置了文件,以便当有人参加测试时,他们的结果会像这样打印:

姓名
年龄
性别
结果

我希望我的代码找到输入的姓名,然后查看姓名下方的年龄是否与输入匹配,然后查看下方的性别是否与输入匹配。如果所有这些都是正确的,它应该打印出结果。

                    //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%
java 文件 try-catch java.util.scanner

评论

2赞 g00se 8/4/2023
请发布您的示例输入文件,格式化为代码
0赞 g00se 8/4/2023
我在那里没有看到任何名字..?
0赞 JustNeedHelp 8/4/2023
在此示例中,单词“test”被视为名称

答:

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
我正在使用示例文件,但仍然一无所获。这很奇怪......我会再检查一下,看看我是否遗漏了什么。谢谢你的帮助。