读取一段文档,输出每个单词出现的频率,并且把出现频率最高的十个单词输出。...

首先是第一次接触博客园,感觉这是一个非常棒的交流平台,不管是菜鸟还是老手都可以在这学习到很多。

首先看到这个题目。首先我对这个题目进行了分析,此过程大概持续了1天时间,最后我确定用Java来完成。

然后就是设计阶段:本程序利用HashMap先存储读取的单词,并且记录出现频率。然后倒入到List中,通过自定义的Comparator来通过频率高低排序,显示前十个。

然后进入编码阶段:此过程持续1天。

最后需要对自己编写的程序进行测试以及修改,发现不好的地方改进。

下面是对此程序每个阶段的具体分析:

一:此段程序是文件读取

File file = new File(path);
        FileInputStream fis = new FileInputStream(file);
        InputStreamReader isr = new InputStreamReader(fis);

二:此段程序是先声明一个StringBuffer对象,通过读取的字符来组成单词,当遇到
不是字母的时候得判断单词放入到一个HashMap中

复制代码
int thechar;
        StringBuffer word = new StringBuffer();
        HashMap<String, Integer> wordList = new HashMap<String, Integer>();

        while ((thechar = isr.read()) != -1) {
            char letter = (char) thechar;
            if ((letter >= 'a' && letter <= 'z')
                    || (letter >= 'A' && letter <= 'Z')) {
                word.append(letter);
            } else if (word.length() != 0) {
                String theword = new String(word);
                if (wordList.containsKey(theword)) {
                    wordList.put(theword, wordList.get(theword) + 1);
                } else {
                    wordList.put(theword, 1);
                }
                word.delete(0, word.length());
            }
        }
        isr.close();
复制代码

三:将HashMap中的数据放到list中,利用Collections类提供的sort方法,根据自定义的Comparator来按照单词出现的频率从高到低显示,
此处利用Map对象的原理,将Map对象中的键值对组(Map.Entry)调出来排序

 

复制代码
List<Map.Entry<String, Integer>> words = new ArrayList<Map.Entry<String, Integer>>(
                wordList.entrySet());

        Collections.sort(words, new Comparator<Map.Entry<String, Integer>>() {

            @Override
            public int compare(Entry<String, Integer> o1,
                    Entry<String, Integer> o2) {
                //按照出现频率排序由高到低
                return - (o1.getValue() - o2.getValue());
                //按照字母顺序排序
//                return (o1.getKey()).toString().compareTo(o2.getKey());
            }
        });
复制代码

四:下面是完整程序

复制代码
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class ReadingTest {
    private static String path = "a.txt";

    public static void main(String[] args) throws IOException {

        File file = new File(path);
        FileInputStream fis = new FileInputStream(file);
        InputStreamReader isr = new InputStreamReader(fis);
        // BufferedReader br = new BufferedReader(isr);

        // String data = null;

        int thechar;
        StringBuffer word = new StringBuffer();
        HashMap<String, Integer> wordList = new HashMap<String, Integer>();

        while ((thechar = isr.read()) != -1) {
            char letter = (char) thechar;
            if ((letter >= 'a' && letter <= 'z')
                    || (letter >= 'A' && letter <= 'Z')) {
                word.append(letter);
            } else if (word.length() != 0) {
                String theword = new String(word);
                if (wordList.containsKey(theword)) {
                    wordList.put(theword, wordList.get(theword) + 1);
                } else {
                    wordList.put(theword, 1);
                }
                word.delete(0, word.length());
            }
        }
        isr.close();
        // br.close();
        System.out.println("排序前:");
        for (String key : wordList.keySet()) {
            System.out.println(key + " : " + wordList.get(key));
        }

            

        System.out.println("排序后:");
        
        int i = 0;

        for (Map.Entry<String, Integer> node : words) {
            if(i<10){            
                System.out.println(node.getKey() + " : " + node.getValue());
            }else{
                break;
            }
            i++;
        }
    }

}
复制代码

完成一次实验需要对实验进行分析,设计,编码,测试等多个步骤,每一步都不可缺少,这样才能保证实验的完整性。

转载于:https://www.cnblogs.com/hubaoyue/p/3760453.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下脚本实现该功能: ``` #!/bin/bash # 创建一个空的字典 declare -A word_count # 循环遍历文件的每一行 while read line; do # 将行拆分成单词数组 words=($line) # 循环遍历单词数组 for word in "${words[@]}"; do # 在字典中将单词计数器加 1 word_count[$word]=$((word_count[$word] + 1)) done done < words.txt # 循环遍历字典,输出每个单词及其出现次数 for word in "${!word_count[@]}"; do echo "$word: ${word_count[$word]} times" done ``` 上述脚本使用了一个叫做 "字典" 的数据结构来记录每个单词出现次数。字典是一种可以将数据项相关联的数据结构,其中每个数据项都包含一个键和一个值。在上述脚本中,我们使用了一个叫做 `word_count` 的字典,将每个单词作为键,将单词出现的次数作为值。 注意:上述脚本需要在 bash 环境下运行,并且需要使用 "associative arrays" 功能,该功能在 bash 版本 4.0 及以上中可用。 ### 回答2: 要实现这个功能,可以编写一个Bash脚本来统计words.txt文件中每个单词出现频率。以下是一个示例脚本: ```bash #!/bin/bash # 读取文本文件的内容 text=$(cat words.txt) # 将文本内容按照空格和换行进行分隔,并将结果存储在数组中 words=($text) # 创建一个关联数组来存储单词及其出现频率 declare -A freq # 遍历数组中的单词,并统计频率 for word in "${words[@]}"; do if [[ $word != "" ]]; then ((freq[$word]++)) fi done # 输出每个单词及其出现频率 for word in "${!freq[@]}"; do echo "$word ${freq[$word]}" done ``` 使用这个脚本,你可以执行以下命令来统计words.txt文件中每个单词频率: ```bash bash script.sh ``` 脚本将输出每个单词及其出现频率,如下所示: ``` apple 3 banana 2 orange 1 ``` 这表示在words.txt文件中,"apple"单词出现了3次,"banana"单词出现了2次,"orange"单词出现了1次。 ### 回答3: 你可以编写一个bash脚本来统计文本文件words.txt中每个单词出现频率。以下是一个简单的脚本示例: #!/bin/bash # 读取文件中的每个单词并计数 cat words.txt | tr -s ' ' '\n' | sort | uniq -c | sort -nr # 输出示例: # 2 apple # 1 banana # 3 orange # ... # 解释: # - 使用cat命令读取文件内容,并将多个空格转换为单个换行符 # - 使用sort命令对单词进行排序,以确保相同的单词相邻 # - 使用uniq命令统计每个单词出现频率,并在输出结果中添加计数 # - 再次使用sort命令对计数进行逆序排序,以便先显示出现频率最高单词 你可以将以上脚本保存为word_frequency.sh文件,然后在终端中运行chmod +x word_frequency.sh命令,为脚本添加执行权限。接下来,你可以使用./word_frequency.sh命令来运行脚本,并将结果输出到终端中。 注意:在运行脚本之前,请确保已经存在words.txt文件,并包含所需的文本数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值