字长频率计数器

时间:2015-07-29 14:02:16

标签: java counter frequency word

到目前为止我的代码是

import java.io.*;

import static java.lang.System.*;

public class Curtis_Rodney_group8 {

    public static void main(String[] args) {
        try {
            FileReader fr = new FileReader("body.txt"); 
            BufferedReader br = new BufferedReader(fr); 

            String body;
            while ((body = br.readLine()) != null) { //read a line at a time
                out.println(body + "\n"); //disply the text untill the end of the file
            }

            br.close();
        } catch (IOException e) {
            out.println("File not found"); //if the file name is incorrect 


        }

    }
}

此代码打印出文件body.txt的内容,这就是我想要的。

但是我现在希望能够拥有一个字长计数器。例如,句子I am a man将产生输出2, 1, 1(即两个长度为1的单词,一个长度为2的单词和一个长度为3的单词)。

我不是一个非常有经验的程序员,我也不是在寻找直接的答案。我想知道我现在如何开始下一段代码,我想我使用了body部分,因为它是字符串,我使用了body = br.readLine()。我不确定代码的下一个和平是如何开始的。我是否为下一段代码创建了一个新类。我希望你理解我的要求,感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

请查看下面的代码

public class FrequencyCounter {
public static void main(String args[]) {
    try {
        FileReader fr = new FileReader("body.txt");
        BufferedReader br = new BufferedReader(fr);
        Map<Integer, Integer> lengthCounter = new HashMap<Integer, Integer>();

        String body;
        while ((body = br.readLine()) != null) { // read a line at a time
            System.out.println(body);
            String[] textSplit = body.split(" ");
            for(int i=0;i<textSplit.length;i++){
                if(lengthCounter.keySet().contains(textSplit[i].length())){
                    lengthCounter.put(textSplit[i].length(),lengthCounter.get(textSplit[i].length())+1);
                } else {
                    lengthCounter.put(textSplit[i].length(),1);
                }
            }
        }

        Iterator<Integer> iter = lengthCounter.keySet().iterator();
        while(iter.hasNext()){
            int x=iter.next();
            System.out.println("Length : "+ x + " ... Freq : "+ lengthCounter.get(x));
        }
        br.close();
    } catch (IOException e) {
        System.out.println("File not found"); // if the file name is
                                                // incorrect
    }

}
}

基本上这里的想法是我使用地图来存储字符串中每个长度和该长度的单词的频率。

执行拆分以从文本文件中读取行中的每个单词,然后检查之前是否遇到过相同长度的单词。如果不是,则将该长度添加到Map,否则将该长度的先前现有值增加为1。

我获得以下代码的输出是:

hello
my name is Abhi
I am a guy

Length : 1 ... Freq : 2
Length : 2 ... Freq : 3
Length : 3 ... Freq : 1
Length : 4 ... Freq : 2
Length : 5 ... Freq : 1

,其中     你好     我的名字是阿比     我是一个人

是从文件中读取的文本。

希望有所帮助。

答案 1 :(得分:1)

以下是使用数组的解决方案。这个应该更容易理解。这个解决方案的唯一缺点是我们假设文本中单词的最大长度可能是99。

int[] lengthCounterArray = new int[100];

如果你可以使用类似的约束,这个解决方案对你来说很合适。

public class FrequencyCounter{
public static void main(String[] args) {
    try {
        FileReader fr = new FileReader("body.txt");
        BufferedReader br = new BufferedReader(fr);
        Map<Integer, Integer> lengthCounter = new HashMap<Integer, Integer>();
        int[] lengthCounterArray = new int[100]; // assuming the maximum
                                                    // word length would be
                                                    // 99 for this program
        Arrays.fill(lengthCounterArray, 0);// initializing array values to 0
        String body;
        while ((body = br.readLine()) != null) { // read a line at a time
            System.out.println(body);
            String[] textSplit = body.split(" ");
            for (int i = 0; i < textSplit.length; i++) {
                lengthCounterArray[textSplit[i].length()] += 1;
            }
        }

        for(int i =0;i<100;i++) {
            if(lengthCounterArray[i]==0)
                continue;
            else {
                System.out.println(" Length : "+i+" ... Freq : "+lengthCounterArray[i]);
            }
        }
        br.close();
    } catch (IOException e) {
        System.out.println("File not found"); // if the file name is
                                                // incorrect
    }
}

这段代码的输出与前一段相同

hello
my name is Abhi
I am a guy
 Length : 1 ... Freq : 2
 Length : 2 ... Freq : 3
 Length : 3 ... Freq : 1
 Length : 4 ... Freq : 2
 Length : 5 ... Freq : 1

希望有所帮助。

答案 2 :(得分:0)

您可能想要另一个类(让它称之为FrequencyCounter),它需要一行文本(在方法中 - 让我们称之为 processLine ),将其拆分单词,并使用每个单词的长度来更新特定长度的计数器。您可以使用Map或List,但如果您知道最大可能的字长,则使用数组可能更简单,更快(例如, int [100] 应该足够多在多数情况下)。例如,在 processLine()中,如果遇到单词&#34; man&#34;,则将长度设置为3,然后更新计数器( this.counter [长度] ++ )。

在现有代码中,在循环中,您将调用 myFrequencyCounter.processLine(body) - myFrequencyCounter是新类(FrequencyCounter)的一个实例,您需要在开始之前实例化它 while 循环。

当while循环完成时,myFrequencyCounter将有一个计数器字段,一个int数组,其中索引是长度,值是频率计数。您可以为 FrequencyCounter 提供打印频率的方法,并在 while 循环后调用它。