Java如何用HaspMap统计次数并排序详解

瑞星  论坛元老 | 2024-12-19 09:52:54 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1855|帖子 1855|积分 5565

java统计单词频率

继上一讲Java用PDFTextStripper来剖析pdf文件提取文字 - ivanlee717 - 博客园讲了如何吸收息争析pdf之后,我们把pdf文件全部转为了String范例的字符串,那么这一讲聊聊怎么去统计每个词出现的频率。
正则过滤

首先我们需要把单词弄出来,把其他的文字过滤掉。
  1. Pattern pattern = Pattern.compile("\\b[a-z]+\\b");
  2. Matcher matcher = pattern.matcher(s.toLowerCase());
复制代码
\\b 是一个元字符(metacharacter),表示单词边界。它匹配的是位置,而不是具体的字符。它确保匹配的单词前后是单词边界,即单词的开头或结尾,大概与非单词字符相邻。比方,在字符串 "hello regina" 中,\b 会匹配 h 之前、o 之后、r 之前和 a 之后的位置。
具体来说,\\b 匹配以下几种情况:

  • 字符串的开头或结尾。
  • 一个单词字符(字母、数字、下划线)紧接在非单词字符(如空格、标点符号等)之后,或反之亦然。
[a-z] 是一个字符类,表示匹配任意一个小写字母(从 a 到 z)。

  • [A-Za-z]:匹配任意巨细写字母。
  • [0-9]:匹配任意数字。
  • [a-zA-Z0-9_]:匹配任意字母、数字或下划线(相当于 \w)。
  • [aeiou]:匹配任意元音字母。
+是一个量词,表示前面的元素必须出现一次或多次。
量词可以应用于单个字符、字符类或更复杂的表达式。常见的量词包括:

  • *:匹配零次或多次。
  • +:匹配一次或多次。
  • ?:匹配零次或一次。
  • {n}:精确匹配 n 次。
  • {n,}:匹配至少 n 次。
  • {n,m}:匹配至少 n 次,最多 m 次。
第二个\\b仍然表示单词边界,但它出现在模式的末尾,确保匹配的单词以单词边界竣事。
在设置好匹配规则以后,就要去进行匹配了。matcher(CharSequence input):这是 Pattern 类的一个实例方法,用于创建一个 Matcher 对象。Matcher 对象可以在给定的输入字符串(input)中查找与正则表达式模式匹配的子串。

find():实验找到下一个与模式匹配的子串。如果找到匹配项,则返回 true,并将匹配位置更新到下一个匹配项的起始位置
group():返回当前匹配的子串。只有在调用 find() 或 matches() 成功后,才能调用 group()。
start() 和 end():分别返回当前匹配项的起始和竣事索引。
replaceAll(String replacement) 和 replaceFirst(String replacement):用于替换全部或第一个匹配项。
reset():重置 Matcher,使其重新开始匹配新的输入字符串。
然后我们用一个哈希表来存储每个单词的出现频率。
  1. HashMap<String, Integer> wordCount = new HashMap<>();
复制代码
  1. while (matcher.find()) {
  2.     String word = matcher.group();
  3.     if (word.length() > 5) {
  4.         wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
  5.     }
  6. }
复制代码
我们一次来剖析查到的每一个步调。首先如果不绝有单词出现,那么match.find()就会不绝为true,然后始终在遍历循环。


每一次遍历成功之后都会把单词组在一起返回一个String,循环往复我们就可以把全部单词都遍历一次。
HashMap

getOrDefault(K key, V defaultValue):这是 Map 接口的一个方法,用于获取指定键(key)对应的值。如果该键不存在,则返回提供的默认值(defaultValue)。代码里面我们先查找这个ielts的单词,发现并没有存储,于是设置成0 。
put(K key, V value):这是 Map 接口的一个方法,用于将指定的键值对插入到 Map 中。如果该键已经存在,则更新其对应的值。

运行put方法之后,

while循环竣事之后,就形成了一个统计表,然后我们对统计表按照次数排个序。
wordCount.entrySet().stream(): entrySet()是 Map 接口的一个方法,返回一个包含全部键值对的 Set。每个 Map.Entry 对象代表一个键值对。stream()是 Collection 接口的一个方法,用于将聚集转换为一个流(Stream)。流是数据的序列化容器,支持各种中间操作和终端操作,可以进行链式调用,从而实现高效的批量数据处理。

filter(Predicate

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

瑞星

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表