在我的课程中,我们的任务是确定有关通过控制台输入传递的文件的三个关键统计信息:1)字符数,2)行数,3)单词数。在将此问题作为重复提出之前,请继续阅读以了解我遇到的独特问题。谢谢:))
我最初用三种不同的方法和三种不同的Scanner变量编写了一个解决方案,但我意识到对于较大的文件,这种解决方案效率非常低。相反,我决定编写一个只运行一次文件的解决方案,并一次性计算所有三个统计数据。以下是我到目前为止的情况:
import java.util.*;
import java.io.*;
public class FileStatistics
{
// Note: uncomment (A) and (B) below to test execution time
public static void main( String [] args ) throws IOException
{
/* (A)
long startTime = System.currentTimeMillis();
*/
File file = new File(args[0]);
Scanner input = new Scanner(file);
int numChars = 0, numWords = 0, numLines = 0;
/* Calculations */
while( input.hasNextLine() )
{
String currentLine = input.nextLine();
numLines++;
numChars+= currentLine.length();
String [] words = currentLine.split(" ");
numWords += words.length;
}
input.close();
/* Results */
System.out.println( "File " + file.getName() + " has ");
System.out.println( numChars + " characters");
System.out.println( numWords + " words");
System.out.println( numLines + " lines");
/* (B)
long endTime = System.currentTimeMillis();
System.out.println("Execution took: " + (endTime-startTime)/1000.0 + " seconds");
*/
}
}
我一直在将我的程序结果与Microsoft Word自己的文件统计信息进行比较,只需将我使用的任何文件的内容复制/粘贴到Word中即可。正确计算字符数和行数。
但是,我的程序没有正确计算单词数。我决定在那里包含一个测试语句来打印出数组words
的内容,似乎某些"空间格式化" (如Java源代码文件中的选项卡)被视为拆分数组中的单个元素。我尝试在调用split方法之前执行currentLine.replace("\t", "")
以删除这些选项卡,但这并没有改变任何事情。
有人可以就我的错误提供一些建议或提示吗?
答案 0 :(得分:0)
这是因为currentLine.split(" ")
返回的String数组可以包含空字符串的元素:""
。如果您拨打System.out.println(Arrays.toString(words))
,就可以看到此信息。
要创建所需的行为,您可以将words.length
存储在变量count
中,并为count
中空字符""
的每个实例递减words
以下是一个示例解决方案:
while( input.hasNextLine() )
{
String currentLine = input.nextLine();
numLines++;
numChars+= currentLine.length();
String [] words = currentLine.split("\\s+");
int count = words.length;
for (int i = 0; i < words.length; i++) {
if (words[i].equals("")) {
count--;
}
}
numWords += count;
}
或者,您可以将words
转换为ArrayList
并使用removeAll()
函数:
while( input.hasNextLine() )
{
String currentLine = input.nextLine();
numLines++;
numChars+= currentLine.length();
ArrayList<String> words = new ArrayList<>(Arrays.asList(currentLine.split("\\s+")));
words.removeAll(Collections.singleton(""));
numWords += words.size();
}