为了账号安全,请及时绑定邮箱和手机立即绑定

为什么一个 println 语句会更改代码的整个输出?

为什么一个 println 语句会更改代码的整个输出?

紫衣仙女 2022-09-14 16:11:44
问题我目前正在创建一个程序来读取文件并找到几个变量。我遇到了这个问题,其中更改一个println会更改代码的整个输出。我以前从未遇到过这种情况,不确定这是日食错误还是我的错误?我的代码import java.io.File;import java.io.IOException;import java.util.Scanner;public class FileAnalyzer {    public static void main(String args[]) throws IOException {        Scanner input = new Scanner(System.in);        String fileName;        int words = 0, letters = 0, blanks = 0, digits = 0, miscChars = 0, lines = 0;        System.out.print("Please enter the file path of a .txt file: ");        fileName = input.nextLine();        File text = new File(fileName);        //System.out.println(text.exists());        Scanner word = new Scanner(text);        while(word.hasNext()) {            //System.out.println(word.next());            words++;        }        word.close();        Scanner letter = new Scanner(text);        while(letter.hasNext()) {            String currentWord = letter.next().toLowerCase();            for(int i = 0; i < currentWord.length(); i++) {                if(Character.isLetter(currentWord.charAt(i))) {                    letters++;                }            }        }        letter.close();        Scanner blank = new Scanner(text);        while(blank.hasNextLine()) {            String currentWord = blank.nextLine();            for(int j = 0; j < currentWord.length(); j++) {                if (currentWord.charAt(j) == ' ') {                    blanks++;                }            }        }        blank.close();        System.out.println("Words: " + words);        System.out.println("Letters: " + letters);        System.out.println("Blanks: " + blanks);    }}然而只需在第一个扫描仪实例中进行更改即可更改整个输出。如果我把它留在里面,我会得到底部的三个打印语句和我正在寻找的东西。如果我删除它,因为我不想在文件中的每个单词打印,它在控制台中显示为任何内容。不确定为什么 while 语句中的一个 print 语句会更改整个输出。它首先存在的唯一原因是确保扫描仪以我想要的方式接收输入。System.out.println(word.next())
查看完整描述

3 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

不确定为什么 while 语句中的一个打印语句会更改整个输出


因为当该语句存在时,您正在使用扫描程序中的令牌。当它被注释掉时,你不是。消耗令牌的不是打印,而是对 的调用。next()


将其注释掉后,您的循环为:


while (word.hasNext()) {

    words++;

}

hasNext()不会修改扫描仪的状态,因此,如果它进入循环体,它将永远循环。


如果要有一行,可以注释掉或不注释掉,请将代码更改为:


while (word.hasNext()) {

    String next = word.next(); // Consume the word

    System.out.println(next); // Comment this out if you want to

    words++;

}


查看完整回答
反对 回复 2022-09-14
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

通过使用,由于该方法,您将在集合中的元素之间循环。因此,直接调用将允许您在迭代中移动。System.out.println(word.next());next()next()


当注释掉时,将导致你永远循环(如果有一个单词),因为你将无法移动到下一个令牌。//System.out.println(word.next());word.hasNext()


以下代码段将帮助您实现所需的结果


while(word.hasNext()){

   word.next();

   words++;

}


查看完整回答
反对 回复 2022-09-14
?
慕森王

TA贡献1777条经验 获得超3个赞

不知道为什么你想把文本浏览三遍。但是,如果您真的必须这样做,我会先关闭第一台扫描仪,然后再打开下一台扫描仪。


查看完整回答
反对 回复 2022-09-14
  • 3 回答
  • 0 关注
  • 244 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信