【问题标题】:Trying to compare file data to String尝试将文件数据与字符串进行比较
【发布时间】:2016-04-11 00:48:38
【问题描述】:

我试图返回一个字符串是否出现在文件的任何行中,如果有的话,打印出它出现的行。

目前,在控制台中,它会打印我的 ifelse 语句的输出。我不知道我哪里出错了。我想要truefalse,而不是两个值。这是我在控制台中得到的:

0: -
String False
1: File String, ThisString
String False

这是我的方法:

public void checkString() {
    int line = 0;
    //fileString = false;
    while (scanner.hasNext()) {
        String str = scanner.nextLine();
        System.out.println(line + ": " + str);
        line++;
        if (str.contains(string)) {
            System.out.println("File String," + string);
            fileString = true;
        } else {
            System.out.println("String False");
        }
    }
}

显然还有额外的代码,这是我挂断的部分。它遵循我从中读取的特定文件的路径。关于这个问题的更多细节:如果代码为真,我想执行一个操作,如果为假或在else 语句中,我想执行一个完全不同的操作。

【问题讨论】:

  • 嗯,你在一个循环中,第一次通过循环它打印一个东西,第二次它打印另一个东西。这就是为什么你会看到两个输出。听起来您想在循环外部而不是内部打印一些东西,但是您的问题完全不清楚,我不知道您要完成什么。
  • 我试图让代码读取我已经完成的文件。然后,我希望代码将每一行与我在课堂上声明的字符串变量进行比较。如果 .contains 行包含我的字符串,反之亦然,我希望它告诉我该字符串存在于文件中,如果它不存在,那么我希望它告诉我它不存在。我在上面用简单的代码尝试了这个过程,但有点困惑。
  • 因此,如果该行包含字符串,那么您就知道该文件包含该字符串,因此您不必再读取该文件的任何内容,对吗?您可以使用break 语句。另一方面,在您阅读整个文件之前,您无法判断该文件不包含该字符串。所以说文件不包含字符串的行直到循环之后才能打印出来。
  • 您好,Cameron,请查看我对您的问题所做的更改。我已经改写了一些内容并改进了格式 - 我认为这样应该更清楚,并且您获得好的答案的可能性应该会提高。显然,如果您认为可以进一步改进,请随时再次编辑。

标签: java while-loop contains


【解决方案1】:

你可以去寻找包含你的字符串的行的一种方法是这样的:

public String lineContaining(String someString) {
    int lineNumber = 0;
    while (scanner.hasNext()) {
        String eachLine = scanner.nextLine();
        System.out.println(lineNumber + ": " + eachLine);
        lineNumber++;
        if (eachLine.contains(someString)) {
            System.out.println("Found string " + someString
                    + " in line " + lineNumber + ": " + eachLine);
            return eachLine;
        }
    }
    return null;
}

此方法将遍历每一行(由您的scanner 提供)并检查它是否包含someString。如果有这样的一行,它会返回它(从而退出while循环);如果没有,该方法返回null,这意味着没有包含您要查找的内容的行。您可以从需要该行的任何地方调用它,对结果执行空检查 (== null) 以查看是否找到了行,然后从那里相应地继续。如果您需要更多信息,例如找到您的字符串的行号,我建议创建一个简单的包装器对象,该对象包含一个字符串(找到您的子字符串的行)和一个整数(行号);那么您的方法可以返回该包装器而不是 String

请注意,我已将您的 line 变量重命名为 lineNumber(在我看来,line 听起来像是一个字符串,而不是一个 int),并将 str 重命名为 eachLine(从Smalltalk,强调变量的迭代性质)。

【讨论】:

    猜你喜欢
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多