Java 文本中X字母单词的频率
我正在尝试创建一个程序来计算给定文本文件中1个字母、2个字母等单词的频率。但是,它似乎只适用于小文件 我查找了一些涉及数组的解决方案(我不完全理解),并将它们合并到代码中。当我用几个字测试一个文件时,它是有效的,但是当给一个大文件时,比如整个《罗密欧与朱丽叶》,它给出了错误的结果 (还有,“for(String str:strings)”在做什么?)Java 文本中X字母单词的频率,java,arrays,Java,Arrays,我正在尝试创建一个程序来计算给定文本文件中1个字母、2个字母等单词的频率。但是,它似乎只适用于小文件 我查找了一些涉及数组的解决方案(我不完全理解),并将它们合并到代码中。当我用几个字测试一个文件时,它是有效的,但是当给一个大文件时,比如整个《罗密欧与朱丽叶》,它给出了错误的结果 (还有,“for(String str:strings)”在做什么?) import java.util.Scanner; 导入java.io.File; 导入java.io.FileNotFoundException
import java.util.Scanner;
导入java.io.File;
导入java.io.FileNotFoundException;
类作者
{
公共静态void main(字符串[]args)
{
尝试
{
System.out.print(“输入文件的名称:”);
扫描仪输入=新扫描仪(系统输入);
字符串名称=in.nextLine();
文件文本=新文件(名称);
扫描器in2=新扫描器(文本);
String line=in2.nextLine();
String[]strings=line.split(“”);
int[]计数=新的int[14];
for(字符串str:strings)
{
if(str.length() 对于(inti=1;i您可以使用ApacheCommonsCountMatches方法-
StringUtils.countMatches(String string, String subStringToCount).
前-
System.out.println(StringUtils.countMatches("String string".toUpperCase(), "S"));
给出输出=2。增强的For循环在第14章JLS()的块和语句中进行了介绍,并(部分)说明-
增强型for语句的含义通过翻译成基本for语句给出,如下所示:
...
表达式必须具有数组类型T[]。
让L1…Lm成为紧靠enhanced for语句前面的标签序列(可能为空)
增强型for语句相当于以下形式的基本for语句:
T[] #a = Expression;
L1: L2: ... Lm:
for (int #i = 0; #i < #a.length; #i++) {
{VariableModifier} TargetType Identifier = #a[#i];
Statement
}
最后,您的程序一次只在一行上运行。如果您想在所有行上运行,则需要在捕捉之后移动输出循环,并在尝试之前放置int[]counts=new int[14];
int[] counts = new int[14];
try {
// ...
} catch (Exception e) {
System.out.println("Exception: " + e.getMessage());
e.printStackTrace();
}
for (int i = 0; i < counts.length; i++) { // <-- and arrays start at 0.
System.out.print("Proportion of " + (i+1) + "-letter words: ");
System.out.println("( " + counts[i] + " words )");
}
int[]计数=新的int[14];
试一试{
// ...
}捕获(例外e){
System.out.println(“异常:+e.getMessage());
e、 printStackTrace();
}
for(int i=0;icatch
块中所做的事情是可笑的。不要忽略异常及其消息。什么是“for(String str:strings)”做什么?它被称为增强的for循环或for each循环,它通过数组/集合的元素循环,而不是通过索引。添加@SotiriosDelimanolis注释:这是一种讽刺。堆栈跟踪可能非常有价值。什么意思是它给出了错误的结果
?请检查这里,感谢链接和注释。但我似乎仍然不能o找出为什么它对一个短文件有效,并对任何较大的文件给出荒谬的结果(大部分为零)…@syhark您的短文件中有多少行?还记得您的工作吗?一次一行…一行。所以我移动了输出循环和int[]计数,但下次尝试调试器时也会发生同样的情况。我没有访问您的。事实上,请稍候。找到它后,您也只读取任何输入的第一行。
catch (Exception e) // FileNotFoundException)
{
System.out.println("Exception: " + e.getMessage());
e.printStackTrace();
}
int[] counts = new int[14];
try {
// ...
} catch (Exception e) {
System.out.println("Exception: " + e.getMessage());
e.printStackTrace();
}
for (int i = 0; i < counts.length; i++) { // <-- and arrays start at 0.
System.out.print("Proportion of " + (i+1) + "-letter words: ");
System.out.println("( " + counts[i] + " words )");
}
Scanner in2 = new Scanner(text);
String line;
while ((line = in2.nextLine()) != null) { // <-- read all the lines
String[] strings = line.split(" ");
for (String str : strings) {
if (str.length() < counts.length) {
counts[str.length()]++;
}
}
}