Java 为什么我的程序在IntelliJ中读取文本文件时不计算单词hello

Java 为什么我的程序在IntelliJ中读取文本文件时不计算单词hello,java,intellij-idea,Java,Intellij Idea,我不熟悉java和一般的编码,我正在学习如何读取文件。我查看了如何通过拖动文件将其添加到src文件夹的过程,但我的问题仍然存在,为什么我的程序在成功读取文件时不计算字符串“hello”。根据我的想法,它是显示给我们的第一个元素,我使用IF语句通过将其存储在字符串元素行中进行检查。有人能用初学者友好的方式给我解释一下吗 public class Main { public static void main(String[] args) throws FileNotFoundExceptio

我不熟悉java和一般的编码,我正在学习如何读取文件。我查看了如何通过拖动文件将其添加到src文件夹的过程,但我的问题仍然存在,为什么我的程序在成功读取文件时不计算字符串“hello”。根据我的想法,它是显示给我们的第一个元素,我使用IF语句通过将其存储在字符串元素行中进行检查。有人能用初学者友好的方式给我解释一下吗

public class Main {
    public static void main(String[] args) throws FileNotFoundException {
        File path = new File("C:\\Users\\fahad\\IdeaProjects\\testingFileIO\\src\com\\Fahad\\Readingfile.txt");
        Scanner fileread = new Scanner(path);
        String check = "hello";
        int count=0;

        boolean flag = false;
        while(fileread.hasNextLine()){
            String line = fileread.nextLine();
            System.out.println(line);
            if(line == check)
            {
                flag = true;
                count++;
            }
        }

        if(flag == true)
        {
            System.out.println("WE found it" + count);
        }
        else
        {
            Syste.out.println("No string was there");
        }
    }
}
输出

hello world.
This is fahad Qazi
How are you doing ?
checking
1234567
No string was there

我是stackoverflow新手,对这个问题非常抱歉,但如果您不必使用“==”来比较字符串值,我们将非常感谢您的帮助

您必须与String类中的equals方法进行比较。 例如:

String x="hello",y="world";
if(x.equals(y)){

}

或者,如果要比较两个字符串并忽略大小写,可以使用
x.equalsIgnoreCase(y)

大部分代码都可以。它可以更好,但它的好的开始。 至于你哪里出了问题,是这样的:

if (line == check)
如果整行等于字符串“hello”,则比较整行。这将返回
false
,因为所讨论的行是
hello world

解决这个问题的一个办法是做一个简单的操作。下面是一个例子

String myStr = "Hello world";
System.out.println(myStr.contains("Hello"));   // true
System.out.println(myStr.contains("world"));   // true
System.out.println(myStr.contains("hello"));   // false due to case sensitivity
System.out.println(myStr.contains("Hi"));      // false
因此,在您的情况下,您应该使用以下内容检查:

if (line.contains(check)) // do the things you wanna do when the line contains 'hello'

直接
==
对字符串的操作将不起作用。您需要使用
String
类中的
contains(CharSequence s)
方法来检查给定字符串中是否存在所需的字符序列。为了获得所需的结果,您需要在代码中使用此方法

此外,如果您使用的是Java 8+,则解决方案可以简化/重新编写为:

long count = Files.lines(Paths.get(<your_file_path>))
.filter(line -> line.contains(check))
.count();
long count=Files.line(path.get())
.filter(行->行.contains(检查))
.count();

我尝试了建议和输入行。等于(检查),但它仍然给了我布尔值false,没有捕获hello。我看到错误,您正在比较整行:第一行返回“hello world”,因此代码正在比较check是否等于“hello world”。为了能够正确比较,您应该使用split方法按空格分割行。您的代码必须如下所示:
stringwords[]=line.split(“”)
/\u或者您可以在这里使用正则表达式{
来表示(字符串词:words){
如果(word.equals(check)){…}
}
感谢您的澄清,但是什么是正则表达式,正如您在回答的第二部分中提到的那样。还创建了一个字符串,这是怎么回事?比如创建一个包含空间的数组,或者它从文件和空间中获取所有内容,或者在索引到达“”后移动索引??非常感谢。again@Fadedregex(正则表达式)用于输入/字符串验证。如果你有下一个字符串:
Hello world
,你可以看到Hello和world之间有一个空格,因此,如果你使用
line.split(“”
),它将返回如下字符串数组:
{“Hello”,“world”}
。正如你所看到的,该字符串中的空格被删除了。但是如果您的字符串是
Hello World
(带2个空格),则
行.split(“”
将返回
{“Hello”、“”、“World”}
。现在,您可以看到数组包含一个空字符串:“”。因此,解决方案是使用正则表达式,您可以尝试以下操作:
line.split(\\s+)
,其中\\s表示正则表达式中的一个空格,+表示最后一个模式(在本例中为\\s或空格)重复一次或多次。对于初学者,我应该先用他拥有的代码解决问题。然后重构它。说在没有任何其他信息的情况下使用oneliner对他成为一名更好的编码员没有多大帮助。@Baklap4感谢您的指点,我完全同意。在我将来的回答中,我会记住这一点。为了帮助OP更好地理解这个概念,进行了编辑。@ShyamBaitmangalkar,了解更多关于这些代码的信息确实很有帮助。因此,我倾向于把它们写在一本书中,以了解这里发生了什么。对于上面提到的代码。看起来您是直接将变量计数赋值给行??还是一条路??第二次类似于一个方法/函数,它将过滤掉我需要的单词。@grade
Paths.get(“”
将给出一个类型为
Path
的对象
Files.lines()
获取路径对象并从给定文件返回
流。一旦你有了一个
,你就可以对它执行流操作以获得所需的结果。你需要使用String#equals()来比较字符串。如果这个答案是你想要的@laded,请随意将它标记为一个解决方案。这有助于社区轻松找到问题的答案。谢谢。是的,当你编写代码时,效率是最好的,但尝试和错误回答了我的好奇心,。