以下是我的家庭作业分配代码,其中我需要读取外部文件的内容并确定其中的单词数,3个字母的单词数和总数的百分比。我已经做好了这部分工作,但是在显示以上信息之前,我还必须先打印外部文件的内容。下面是我当前的代码:

public class Prog512h
{
   public static void main( String[] args)
   {
    int countsOf3 = 0;
    int countWords = 0;

    DecimalFormat round = new DecimalFormat("##.00"); // will round final value to two decimal places

    Scanner poem = null;
    try
    {
        poem = new Scanner (new File("prog512h.dat.txt"));
    }
    catch (FileNotFoundException e)
    {
        System.out.println ("File not found!"); // returns error if file is not found
        System.exit (0);
    }

    while (poem.hasNext())
    {
        String s = poem.nextLine();
        String[] words = s.split(" ");
        countWords += words.length;
        for (int i = 0; i < words.length; i++)
        {
            countsOf3 += words[i].length() == 3 ? 1 : 0; // checks for 3-letter words
        }
    }

    while(poem.hasNext())
    {
        System.out.println(poem.nextLine());
    }
    System.out.println();
    System.out.println("Number of words: " + countWords);
    System.out.println("Number of 3-letter words: " + countsOf3);
    System.out.println("Percentage of total: " + round.format((double)((double)countsOf3 / (double)countWords) * 100.0)); // converts value to double and calculates percentage by dividing from total number of words
   }

   }


该声明

while(poem.hasNext())
{
    System.out.println(poem.nextLine());
}


应该打印外部文件的内容。但是,事实并非如此。当我尝试将其移动到之前的while循环之前时,它会打印,但是会弄乱我的打印值,包括#个单词,3个字母的单词,百分比等。我不确定这是什么问题。有人可以提供帮助吗?

先感谢您。

最佳答案

您的扫描仪正在尝试重新读取文件,但该文件位于底部,因此不再需要读取任何行。您有两种选择:

选项1

为相同的文件创建一个新的Scanner对象(从头开始),然后在该文件上调用您的while循环(可行,但设计不理想)。

Scanner poem2 = null;
try
{
    poem2 = new Scanner (new File("prog512h.dat.txt"));
}
catch (FileNotFoundException e)
{
    System.out.println ("File not found!"); // returns error if file is not found
    System.exit (0);
}

while(poem2.hasNext())
{
    System.out.println(poem2.nextLine());
}


选项2

更好的选择是在阅读时显示每行。这可以通过在已经存在的while循环中添加额外的一行来实现:

while (poem.hasNext())
{
    String s = poem.nextLine();
    System.out.println(s); // <<< Display each line as you process it
    String[] words = s.split(" ");
    countWords += words.length;
    for (int i = 0; i < words.length; i++)
    {
        countsOf3 += words[i].length() == 3 ? 1 : 0; // checks for 3-letter words
    }
}


这仅需要一个Scanner对象,并且只需要对该文件进行一次读取,效率更高得多。

09-25 20:15