单词查找排序输出

前几天软件工程老师布置了一道题,关于单词查找排序的问题,题目是找出一篇英文文章出出现频率最高的十个单词,并打印输出。初看到这个题目,觉得不难,无非是文件读入,数组,查找单词,比较排序之类的,但是由于学得比较渣,编程水平有限,所以借助大神的力量,经过多方学习和借鉴,用java实现了。因为近年来比较流行java,java有丰富的类库和函数,可以拿来直接用,所以比较方便编程。接下来介绍java代码的思路。

需求分析:查找十个频率最高的单词,然后输出单词及其次数。首先导入文件,可以用BufferedReader,然后用正则表达式匹配单词,如果用空格和标点也行,但是有个问题,文章中的引号不好分离,所以还是用 Pattern.compile("[a-zA-Z]+")比较好,然后用map进行相同字数的统计,然后排序,但是treemap是按key比较排序的,此题应该是换成按value比较,所以要重写比较器,最后用Collections.sort(list, comparator)进行排序。

接下来是程序代码:

import java.io.*;//通过数据流、序列化和文件系统提供系统输入和输出
import java.util.*;//包含 collection 框架、遗留的 collection 类、各种工具类(字符串标记生成器、随机数生成器和位数组)
import java.util.regex.*;//负责对字符序列进行正则表达式匹配
public class Counts {
public static void main(String[] args) throws Exception {  //抛出异常

BufferedReader reader = new BufferedReader(new FileReader(     //从文件中导入内容
                "C:\\Users\\admin\\desktop\\ok.txt"));
        StringBuffer buffer = new StringBuffer();
        String line = null;
        while ((line = reader.readLine()) != null) {
            buffer.append(line);
        }
        reader.close();
        Pattern expression = Pattern.compile("[a-zA-Z]+");// 定义正则表达式匹配单词
        String string = buffer.toString();
        Matcher matcher = expression.matcher(string);//
        Map<String, Integer> map = new TreeMap<String, Integer>();
        String word = "";
        int times = 0;
        while (matcher.find()) {// 是否匹配单词
            word = matcher.group();// 得到一个单词-树映射的键
            if (map.containsKey(word)) {// 如果包含该键,单词出现过
                times = map.get(word);// 得到单词出现的次数
                map.put(word, times + 1);
            } else {
                map.put(word, 1);// 否则单词第一次出现,添加到映射中
            }
        }
        
        List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>( //按照TreeMap 的value排序而不是key排序.将Map.Entry放在集合里
                map.entrySet());
        
        Comparator<Map.Entry<String, Integer>> comparator = new Comparator<Map.Entry<String, Integer>>() {  //重写比较器
            public int compare(Map.Entry<String, Integer> left,
                    Map.Entry<String, Integer> right) {
                return (left.getValue()).compareTo(right.getValue()); // 取出单词个数(value)比较
            }
        };
        System.out.println("以下是频率最高的十个词:");
        Collections.sort(list, comparator);// 排序
        
        int last = list.size() - 1;
        for (int i = last; i > last - 10; i--) {  // 打印最多十个
            String key = list.get(i).getKey();
            Integer value = list.get(i).getValue();
            System.out.println("单词:"+key +" \n"+"次数:" + value);
        }
    }
}

 

 

转载于:https://www.cnblogs.com/suhaiyan/p/3575550.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单词检查是指对一段文本中出现的单词进行检查,以确定它们是否在一个指定的单词列表中出现过。这个问题可以使用二叉排序树来解决。 二叉排序树是一种有序的二叉树,它满足以下条件: - 对于二叉树中的每个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。 - 每个节点都没有重复的值。 我们可以将单词列表中的单词插入到二叉排序树中,并对文本中出现的每个单词进行查找。如果单词存在于二叉排序树中,则说明它出现在单词列表中,否则它不在单词列表中。 下面是一个简单的实现: ```c++ #include <iostream> #include <string> using namespace std; // 二叉排序树节点 struct Node { string word; Node* left; Node* right; Node(const string& w) : word(w), left(nullptr), right(nullptr) {} }; // 插入单词到二叉排序树中 Node* insert(Node* root, const string& word) { if (root == nullptr) { return new Node(word); } if (word < root->word) { root->left = insert(root->left, word); } else if (word > root->word) { root->right = insert(root->right, word); } return root; } // 在二叉排序树中查找单词 bool search(Node* root, const string& word) { if (root == nullptr) { return false; } if (word == root->word) { return true; } else if (word < root->word) { return search(root->left, word); } else { return search(root->right, word); } } int main() { // 构建单词列表 string words[] = {"apple", "banana", "cherry", "date", "elderberry"}; Node* root = nullptr; for (const auto& word : words) { root = insert(root, word); } // 在文本中查找单词 string text = "The apple is a fruit. The banana is also a fruit. The cherry is a kind of berry. The date is a sweet fruit. The elderberry is used to make jam."; string word; for (int i = 0; i < text.size(); i++) { if (isalpha(text[i])) { word += tolower(text[i]); } else { if (!word.empty()) { if (search(root, word)) { cout << word << " is in the word list." << endl; } else { cout << word << " is not in the word list." << endl; } word.clear(); } } } return 0; } ``` 在上面的代码中,我们首先构建了一个单词列表,并将它们插入到二叉排序树中。然后,我们对文本中的每个单词进行查找,如果单词单词列表中,则输出它在列表中,否则输出它不在列表中。 需要注意的是,在实际应用中,我们可能需要使用更高效的数据结构来存储单词列表,例如散列表。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值