Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 文本中X字母单词的频率_Java_Arrays - Fatal编程技术网

Java 文本中X字母单词的频率

Java 文本中X字母单词的频率,java,arrays,Java,Arrays,我正在尝试创建一个程序来计算给定文本文件中1个字母、2个字母等单词的频率。但是,它似乎只适用于小文件 我查找了一些涉及数组的解决方案(我不完全理解),并将它们合并到代码中。当我用几个字测试一个文件时,它是有效的,但是当给一个大文件时,比如整个《罗密欧与朱丽叶》,它给出了错误的结果 (还有,“for(String str:strings)”在做什么?) import java.util.Scanner; 导入java.io.File; 导入java.io.FileNotFoundException

我正在尝试创建一个程序来计算给定文本文件中1个字母、2个字母等单词的频率。但是,它似乎只适用于小文件

我查找了一些涉及数组的解决方案(我不完全理解),并将它们合并到代码中。当我用几个字测试一个文件时,它是有效的,但是当给一个大文件时,比如整个《罗密欧与朱丽叶》,它给出了错误的结果

(还有,“for(String str:strings)”在做什么?)

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()]++;
    }
  }
}