【问题标题】:Can't compare the first line of .txt file with a string无法将 .txt 文件的第一行与字符串进行比较
【发布时间】:2019-02-05 14:03:09
【问题描述】:

我想将 studentGrade 数组发送到“calculate”方法来计算平均成绩,但如果文本文件的第一行是参数,我不能。当 "if" 方法运行时,它会返回到 while 循环,即使两个字符串相等。

我已尝试更改 .txt 的第一行,以防出现问题。但结果是一样的。它永远不会比较被通缉的人是否在第一行。

static int studentNumber = 0;
static String[] studentGrade;
static String studentName = "";

static void makeList(String name) {
    try(Scanner sc = new Scanner(new BufferedReader(new FileReader("C:\\Users\\User\\Desktop\\new_1.txt")))) {
        boolean flag = true;
        while (sc.hasNextLine()) {
            flag = true;
            String studentLine = sc.nextLine();
            studentGrade = studentLine.split(",");
            studentName = studentGrade[0];
            if (studentName.equalsIgnoreCase(name)){
                calculate(studentGrade);
                flag = false;
                break;
            }
        }
        if (flag)
        System.out.println("Couldn't found!");
    }
    catch (FileNotFoundException e) {
        System.out.println("An error occured when the file was tried to opened.");
    }
}

static void calculate(String[] a) {
    int note1 = Integer.parseInt(a[1]);
    int note2 = Integer.parseInt(a[2]);
    int note3 = Integer.parseInt(a[3]);
    double avg = Math.ceil((double)(note1 + note2 + note3) / 3);
    System.out.println(a[0] + "'s average is: " + (int)avg);
}

我希望 if 情况为真,并将数组发送到“计算”方法。除了学生在 .txt 文件的第一行之外,它完成了它的工作。例如,如果用户输入的是 Michael,它会显示“找不到!”但如果输入是 John,它会给出平均值。

//First lines of .txt file
Michael,70,90,20
John,90,80,60
Molly,60,30,50

【问题讨论】:

  • 为什么你在找到名字的时候把flag标记为false?
  • 如果您只是阅读行文,为什么还要使用Scanner?只需阅读BufferedReader 中的行。
  • 当我尝试您的代码时,它返回正确的平均值:60、77 和 47
  • 看来您显示的代码应该可以工作。请提供 MCVE(阅读帮助部分以了解它是什么)和产生错误输出的输入。
  • 我使用了断点并检查了程序的步骤。在 if 语句中,任一部分的值都是相同的字符串。但它没有进入 if 语句,它只是返回到 while 循环。

标签: java


【解决方案1】:

我使用您提供的值创建了一个文件:

Michael,70,90,20
John,90,80,60
Molly,60,30,50

当我尝试你的代码时,它似乎工作正常:

makeList("Michael");
makeList("John");
makeList("Molly");

返回

60
77
47

我怀疑你在文件的开头有某种看不见的字符,这就是让你的平等失败的原因。我在解析 XML 时遇到过几次此类问题,解析器会抱怨我的文件不是以 XML 标记开头的。

你能尝试用这 3 行创建一个全新的文件,然后在这个新文件上再次尝试你的程序吗?

【讨论】:

  • 不,没有用。有趣的是代码对你有用,但对我没有用..
  • @tuna 我仍然怀疑该文件,因为代码工作正常
  • @tuna 你可以在这里找到我使用的文件volafile.org/r/tzezpjvm 下载它(不要复制粘贴)并尝试一下。如果它不起作用,我放弃:)
  • 是的,它有效!谢谢。但我想知道是什么问题。顺便说一句,我意识到如果我将 .txt 文件“Micheal”编辑为“Michael Phelps”,它就不再起作用了。你也可以帮我解决一下吗?
  • Michael Phelps,70,90,20 也适用于我,返回 Michael Phelps's average is: 60。看不见的字符可能是由于一些复制/粘贴。可能有很多东西。
【解决方案2】:

这是一种更简单、更清晰的方法:

 try (Stream<String> lines = Files.lines("C:\\Users\\User\\Desktop\\new_1.txt")) {
    Optional<String[]> studentGradesOpt = 
          lines.map(line -> line.split(","))
               .filter(row -> row[0].equalsIgnoreCase(name))
               .findFirst();

    studentGradesOpt.ifPresent(grades -> calculate(grades));
    if (!studentGradesOpt.isPresent()) {
      System.out.println("Couldn't find student " + name);
    }                          
 }

【讨论】:

  • 感谢您的帮助,但我还没有研究过 lambda 表达式。对不起
猜你喜欢
  • 2022-01-06
  • 1970-01-01
  • 2013-07-28
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多