以下是我的家庭作业分配代码,其中我需要读取外部文件的内容并确定其中的单词数,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
对象,并且只需要对该文件进行一次读取,效率更高得多。