0

这是一个家庭作业。我正在尝试制作一个程序,在文本文件中搜索特定单词,然后打印出单词的频率。

public class WordFreq extends Echo{

ArrayList<WordCount>array1=new ArrayList<WordCount>();
String[] words;
int wordsTotal=0;


public WordFreq(String f, String x) throws IOException
{
  super(f);
  words=x.toLowerCase().split(" ");
}

public void processLine(String line){ 
  String[] lines=line.toLowerCase().split(" ");
  wordsTotal=wordsTotal+lines.length;
  for(int j=0; j<lines.length; j++){
    WordCount alpha=new WordCount(lines[j]);
    alpha.incCount();
    array1.add(alpha);}
  for(int x=0; x<array1.size(); x++){
    for(int y=0; y<array1.size(); y++){
      if(array1.get(x).equals(array1.get(y))&&(x!=y)){
        for(int i = 0; i< array1.get(y).getCount(); i++){
          array1.get(x).incCount();
        }
        array1.remove(y);
      }
    }
  }

}

public void reportFrequencies(){
  for(int i = 0; i<array1.size();i++){
    // System.out.println(array1.get(i).getWord()+" "+array1.get(i).getCount());
  }
  int currentWord=0;
  for(int x=0; x<words.length; x++){
    for(int y=0; y<array1.size(); y++){
      if(words[x].equals(array1.get(y).getWord())){
        currentWord=array1.get(y).getCount();}}
    System.out.print(words[x]+" ");
    System.out.printf("%.4f",(double)currentWord/wordsTotal);
  }
}

}

这是我的主要方法:

public class FreqStudy{
  public static void main(String[] args) throws IOException
  {
    Scanner scan = new Scanner(System.in);
    System.out.println("enter file name");
    String fileName = scan.next();
    Scanner scan2 = new Scanner(System.in);
    System.out.println("enter words to search for");
    System.out.println("enter lower case, separated by spaces");
    String wordString = scan2.nextLine();
    WordFreq f = new WordFreq(fileName,wordString);
    f.readLines();
    f.reportFrequencies();
  }
}

我正在使用简·奥斯汀 (Jane Austen) 所著的《艾玛》一书的 .txt 文件。这是我在运行程序并尝试搜索单词时收到的错误消息:

java.lang.IndexOutOfBoundsException: Index: 906, Size: 906
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.get(ArrayList.java:322)
at WordFreq.processLine(WordFreq.java:26)
at Echo.readLines(Echo.java:16)
at FreqStudy.main(FreqStudy.java:15)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)"

以下是 Echo 和 WordCount 的代码:

public class WordCount{

private String word;
private int count;

public WordCount(String w){
word = w;
count = 0;
}

public String getWord(){
return word;}

public int getCount(){
return count;}

public void incCount(){count++;}

public String toString() {
return(word +  " --- " + count);
}

public boolean equals(Object other){
WordCount i = (WordCount)other;
return (this.word.equals(i.word));
}
}

回声:

import java.util.Scanner;
import java.io.*;


public class Echo{
String fileName; // external file name
Scanner scan; // Scanner object for reading from external file

public Echo(String f) throws IOException
{
fileName = f;
scan = new Scanner(new FileReader(fileName));
}

public void readLines(){ // reads lines, hands each to processLine
while(scan.hasNext()){
  processLine(scan.nextLine());
}
scan.close();
}

public void processLine(String line){ // does the real processing work
System.out.println(line);
}
}

我的代码的第 26 行是:

for(int i = 0; i< array1.get(y).getCount(); i++)
4

3 回答 3

0

如果您想更改您正在迭代的对象,我建议您使用Iterator

您可以ArrayList通过执行以下操作获取迭代器:

Iterator<WordCount> iterator = array1.iterator();

这可能会解决您的问题并简化您的代码。请务必使用:

iterator.remove()而不是array1.remove(index)

于 2013-12-27T22:51:51.740 回答
0

我认为您的问题是您使用array1.size()for 您的边界但在 for 循环中您正在从array1. 所以你的 y 计数器在增加,而你的边界总是在减少。在循环中的特定点,这种增量/减量将导致一种情况,Yarray1.size您尝试执行时,get(y)您将超出范围。

尝试类似的东西

int size = array1.size();  //outside the for loops
....
for(int y=0; y<size; y++){
于 2013-04-16T20:34:48.120 回答
0

在您的嵌套for循环中,您array1在操作array1. 在迭代时不要改变你用来迭代的任何东西。您可能会考虑复制array1以进行迭代。

for(int x=0; x<array1.size(); x++){
    for(int y=0; y<array1.size(); y++){
        if(array1.get(x).equals(array1.get(y))&&(x!=y)){
            for(int i = 0; i< array1.get(y).getCount(); i++){
                 array1.get(x).incCount();
            }
            array1.remove(y); // NO NO NO
        }
    }
}
于 2013-04-16T20:33:12.673 回答