前言

这个程序是java选修课的作业,网上找不到合适的代码,于是自己花费了大量时间整理资料,最后实现功能,有感自己的辛苦,和人民的需求,分享一下。

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
import java.util.regex.Pattern;

程序所有引用的模块

网页爬取

public class Test6 {// 爬取网页源代码public void get_html(String urls) { try {//创建一个URL实例URL url = new URL(urls);try {//通过URL的openStrean方法获取URL对象所表示的自愿字节输入流InputStream str = url.openStream();InputStreamReader str1 = new InputStreamReader(str,"utf-8");//为字符输入流添加缓冲BufferedReader br = new BufferedReader(str1);String data = br.readLine();//读取数据String html="";while (data!=null){//循环读取数据html +=data;data = br.readLine();}// System.out.println(html); br.close();str1.close();str.close();get_text(html);  // 执行get_text,获得正文} catch (IOException e) {e.printStackTrace();}} catch (MalformedURLException e) {e.printStackTrace();}}

在这个函数中,我们爬取了网页的源代码,保存在html变量中,然后将html传入“get_text”函数中,经行文本提取。

注意编码格式,这里设置了编码为“utf-8”,不然会出现中文乱码。

文本提取

public void get_text(String text) throws FileNotFoundException {String htmlStr = text; // 含html标签的字符串String textStr = "";java.util.regex.Pattern p_script;java.util.regex.Matcher m_script;java.util.regex.Pattern p_style;java.util.regex.Matcher m_style;java.util.regex.Pattern p_html;java.util.regex.Matcher m_html;try {String regEx_script = "<[\\s]*?script[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?script[\\s]*?>"; // 定义script的正则表达式{或<script[^>]*?>[\\s\\S]*?<\\/script>String regEx_style = "<[\\s]*?style[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?style[\\s]*?>"; // 定义style的正则表达式{或<style[^>]*?>[\\s\\S]*?<\\/style>String regEx_html = "<[^>]+>"; // 定义HTML标签的正则表达式p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);m_script = p_script.matcher(htmlStr);htmlStr = m_script.replaceAll(""); // 过滤script标签p_style = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE);m_style = p_style.matcher(htmlStr);htmlStr = m_style.replaceAll(""); // 过滤style标签p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);m_html = p_html.matcher(htmlStr);htmlStr = m_html.replaceAll(""); // 过滤html标签textStr = htmlStr;} catch (Exception e) {System.err.println("Html2Text: " + e.getMessage()); }//剔除空格行textStr=textStr.replaceAll("[ ]+", " ");textStr=textStr.replaceAll("(?m)^\\s*$(\\n|\\r\\n)", "");textStr = textStr.replaceAll("[^a-z^A-Z]", " ");//System.out.println(textStr);refine_word1(textStr);refine_letter(textStr);}

在这个函数中,我们对网页源代码进行提取,将所有的英文单词提取出来,并传入"refine_word1","refine_letter"这两个函数中,分别统计单词和字母的频数,并保存到文件中。

单词与字母统计

public void refine_word1(String text) throws FileNotFoundException  {// 单词统计Scanner scanner=new Scanner(text);//单词和数量映射表HashMap<String, Integer > hashMap=new HashMap<String,Integer>();  // 显示频数System.out.println("文章-----------------------------------");while(scanner.hasNextLine()){String line=scanner.nextLine(); // Scanner接受文件流为一个字符串System.out.println(line);//\W+ : 匹配所有非单词String[] lineWords=line.split("\\W+");//用非单词符来做分割,分割出来的就是一个个单词Set<String> wordSet = hashMap.keySet(); // 用于显示单词for(int i=0;i<lineWords.length;i++){//如果已经有这个单词了if(wordSet.contains(lineWords[i])){int number=hashMap.get(lineWords[i]);number++;hashMap.put(lineWords[i], number);}else {hashMap.put(lineWords[i], 1); //put设置键为单词本身,后面参数为它的值}}}System.out.println("统计单词:------------------------------");//hashMap.keySet().iterator(); 返回hash里面的全部key的集合,然后去除重复的元素 Iterator<String> iterator=hashMap.keySet().iterator();while(iterator.hasNext()){try {OutputStreamWriter files = new OutputStreamWriter(new FileOutputStream("bin\\unit8\\words.txt",true),"UTF-8");String word=iterator.next();files.write("单词:"+word+"\t\t\t"+"出现次数:"+hashMap.get(word)+"\n");files.flush();System.out.printf("单词:%-12s 出现次数:%d\n",word,hashMap.get(word));files.close();}catch(IOException  e) {System.out.println("Error");}}System.out.println("程序结束--------------------------------");}// 字母统计public void refine_letter(String str){str = str.toLowerCase();Scanner scanner=new Scanner(str);//单词和数量映射表HashMap<Character, Integer > hashMap=new HashMap<Character,Integer>();  // 显示频数Set<Character> wordSet = hashMap.keySet(); // 用于显示单词for(int i=0;i<str.length();i++){//如果已经有这个单词了if(wordSet.contains(str.charAt(i))){int number=hashMap.get(str.charAt(i));number++;hashMap.put(str.charAt(i), number);}else {hashMap.put(str.charAt(i), 1); //put设置键为单词本身,后面参数为它的值}}System.out.println("统计字母:------------------------------");//hashMap.keySet().iterator(); 返回hash里面的全部key的集合,然后去除重复的元素 Iterator<Character> iterator=hashMap.keySet().iterator();while(iterator.hasNext()){try {OutputStreamWriter files = new OutputStreamWriter(new FileOutputStream("bin\\unit8\\letter.txt",true),"UTF-8");Character word=iterator.next();files.write("字母:"+word+"\t\t\t"+"出现次数:"+hashMap.get(word)+"\n");files.flush();System.out.printf("字母:%-12s 出现次数:%d\n",word,hashMap.get(word));files.close();}catch(IOException  e) {System.out.println("Error");}}System.out.println("程序结束--------------------------------");}

在上面两个函数中,运用hashmap等函数,进行统计。

主函数

public static void main(String[] args){String url = "https://github.com/";Test6 start = new Test6();start.get_html(url);}

程序从这里开始进入,创建一个"start”对象,执行程序。

完整代码

package unit8;import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
import java.util.regex.Pattern;
/*** 通过URL读取页面内容* */public class Test6 {// 爬取网页源代码public void get_html(String urls) { try {//创建一个URL实例URL url = new URL(urls);try {//通过URL的openStrean方法获取URL对象所表示的自愿字节输入流InputStream str = url.openStream();InputStreamReader str1 = new InputStreamReader(str,"utf-8");//为字符输入流添加缓冲BufferedReader br = new BufferedReader(str1);String data = br.readLine();//读取数据String html="";while (data!=null){//循环读取数据html +=data;data = br.readLine();}// System.out.println(html); br.close();str1.close();str.close();get_text(html);  // 执行get_text,获得正文} catch (IOException e) {e.printStackTrace();}} catch (MalformedURLException e) {e.printStackTrace();}}// 将网页源代码中的所有文本信息提取出来public void get_text(String text) throws FileNotFoundException {String htmlStr = text; // 含html标签的字符串String textStr = "";java.util.regex.Pattern p_script;java.util.regex.Matcher m_script;java.util.regex.Pattern p_style;java.util.regex.Matcher m_style;java.util.regex.Pattern p_html;java.util.regex.Matcher m_html;try {String regEx_script = "<[\\s]*?script[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?script[\\s]*?>"; // 定义script的正则表达式{或<script[^>]*?>[\\s\\S]*?<\\/script>String regEx_style = "<[\\s]*?style[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?style[\\s]*?>"; // 定义style的正则表达式{或<style[^>]*?>[\\s\\S]*?<\\/style>String regEx_html = "<[^>]+>"; // 定义HTML标签的正则表达式p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);m_script = p_script.matcher(htmlStr);htmlStr = m_script.replaceAll(""); // 过滤script标签p_style = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE);m_style = p_style.matcher(htmlStr);htmlStr = m_style.replaceAll(""); // 过滤style标签p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);m_html = p_html.matcher(htmlStr);htmlStr = m_html.replaceAll(""); // 过滤html标签textStr = htmlStr;} catch (Exception e) {System.err.println("Html2Text: " + e.getMessage()); }//剔除空格行textStr=textStr.replaceAll("[ ]+", " ");textStr=textStr.replaceAll("(?m)^\\s*$(\\n|\\r\\n)", "");textStr = textStr.replaceAll("[^a-z^A-Z]", " ");//System.out.println(textStr);refine_word1(textStr);refine_letter(textStr);}public void refine_word1(String text) throws FileNotFoundException  {Scanner scanner=new Scanner(text);//单词和数量映射表HashMap<String, Integer > hashMap=new HashMap<String,Integer>();  // 显示频数System.out.println("文章-----------------------------------");while(scanner.hasNextLine()){String line=scanner.nextLine(); // Scanner接受文件流为一个字符串System.out.println(line);//\W+ : 匹配所有非单词String[] lineWords=line.split("\\W+");//用非单词符来做分割,分割出来的就是一个个单词Set<String> wordSet = hashMap.keySet(); // 用于显示单词for(int i=0;i<lineWords.length;i++){//如果已经有这个单词了if(wordSet.contains(lineWords[i])){int number=hashMap.get(lineWords[i]);number++;hashMap.put(lineWords[i], number);}else {hashMap.put(lineWords[i], 1); //put设置键为单词本身,后面参数为它的值}}}System.out.println("统计单词:------------------------------");//hashMap.keySet().iterator(); 返回hash里面的全部key的集合,然后去除重复的元素 Iterator<String> iterator=hashMap.keySet().iterator();while(iterator.hasNext()){try {OutputStreamWriter files = new OutputStreamWriter(new FileOutputStream("bin\\unit8\\words.txt",true),"UTF-8");String word=iterator.next();files.write("单词:"+word+"\t\t\t"+"出现次数:"+hashMap.get(word)+"\n");files.flush();System.out.printf("单词:%-12s 出现次数:%d\n",word,hashMap.get(word));files.close();}catch(IOException  e) {System.out.println("Error");}}System.out.println("程序结束--------------------------------");}public void refine_letter(String str){str = str.toLowerCase();Scanner scanner=new Scanner(str);//单词和数量映射表HashMap<Character, Integer > hashMap=new HashMap<Character,Integer>();  // 显示频数Set<Character> wordSet = hashMap.keySet(); // 用于显示单词for(int i=0;i<str.length();i++){//如果已经有这个单词了if(wordSet.contains(str.charAt(i))){int number=hashMap.get(str.charAt(i));number++;hashMap.put(str.charAt(i), number);}else {hashMap.put(str.charAt(i), 1); //put设置键为单词本身,后面参数为它的值}}System.out.println("统计字母:------------------------------");//hashMap.keySet().iterator(); 返回hash里面的全部key的集合,然后去除重复的元素 Iterator<Character> iterator=hashMap.keySet().iterator();while(iterator.hasNext()){try {OutputStreamWriter files = new OutputStreamWriter(new FileOutputStream("bin\\unit8\\letter.txt",true),"UTF-8");Character word=iterator.next();files.write("字母:"+word+"\t\t\t"+"出现次数:"+hashMap.get(word)+"\n");files.flush();System.out.printf("字母:%-12s 出现次数:%d\n",word,hashMap.get(word));files.close();}catch(IOException  e) {System.out.println("Error");}}System.out.println("程序结束--------------------------------");}public static void main(String[] args){String url = "https://github.com/";Test6 start = new Test6();start.get_html(url);}
}

后记

程序执行完成后,还存在一些问题,例如“who’s",在程序执行过程中会将,"who"和"s"分离,将"s"当作一个独特的单词,而不是和"is”归作一个,其他问题暂未发现,希望有心人可以整改一下,共同学习。

java运用HashMap类统计英文网站上单词与字母出现的次数,保存文件中相关推荐

  1. CSS实现英文或拼音单词首字母大写

    CSS实现英文或拼音单词首字母大写,只需要在css样式中加入: text-transform: capitalize 即可. 测试代码如下: <!doctype html> <htm ...

  2. 怎么让将英文设置为单词首字母大写

    今天跟大家分享一下怎么让将英文设置为单词首字母大写 1.如下图有一些英文文本,现在我们想要将这些文本转为单词首字母大写. 2.首先我们将写着英文复制到Excel中 3.然后选中这些数据单元格区域 4. ...

  3. 使用Java统计英文文章的单词频率。

    spark中的入门级程序:WordCount.这次不是使用spark来完成的,而是使用原生的Java API.只要英文文章符合书写的规定,那么这个程序就没有什么问题. 先将指定文件中的内容读取到Str ...

  4. java(14) - HashMap类

    一.Map接口: Map(映射):将建映射到值的对象.一个映射不能包含重复的键,每个键最多映射到一个值. Map中包含了一个Map.Entry的内部接口,此接口是Map中的一个实体(key-value ...

  5. fomo规则_如何在WordPress网站上使用FOMO来增加转化次数

    fomo规则 You may have heard of FOMO and social proof notifications when reading about latest marketing ...

  6. java vi命令 退出_Git 使用vi或vim命令打开、关闭、保存文件

    1 vi & vim 有两种工作模式: (1)命令模式:接受.执行 vi & vim 操作命令的模式,打开文件后的默认模式: (2)编辑模式:对打开的文件内容进行 增.删.改 操作模式 ...

  7. Java 正则表达式 工具类 中文 英文 email 手机号 身份证 数字 日期

    大家好,我是烤鸭: 分享一个Java版本的正则校验工具类. Validation.java package com.xxx.xxx.common.utils;import java.util.rege ...

  8. 【java作业一】统计英文文章的段落、句子、字符数

    文章目录 一.运行效果 二.思路 三.实现 文件目录结构 代码 四.附录:一段英文 一.运行效果 二.思路 准备好一个存放英文文章的.txt文件. 逐行读取文件. 统计数量: 句子数:以.,!,或?结 ...

  9. 小白学Java代码:类和对象(上)

    编写学生类 package com.jian.demo1;public class Student { //第一步:编写类,比如:学生类//第二步:编写属性也叫做编写编写成员变量,比如:姓名.年龄.性 ...

最新文章

  1. MySQL 学习笔记(3)— 字符串函数、数值函数、日期时间函数、流程函数、聚集函数以及分组数据
  2. 去掉[]中的英文(正则表达式)C#
  3. 封禁华为的美国,现在不得不在5G标准制定上“恢复合作”,网友:5G真香
  4. 数据中心的7个新兴发展趋势
  5. Oracle分页查询2
  6. c语言控制台数字键打地鼠,自己用C写的一个简单的打地鼠游戏代码出了个问题(鼠标和循环不能...
  7. GitFlow 工作流和Code Review教程
  8. jQuery实现禁用和只读
  9. 设备场景函数——72个
  10. LGD:涨点神器!旷视孙剑、张祥雨团队提出标签引导的自蒸馏技术,助力目标检测!...
  11. VS2017 QT/C++ 调用python函数传图像
  12. 【ZBrush笔刷】实用笔刷和Alpah下载,及笔刷使用方法
  13. python怎么变白-Python将png透明变为白色并保存为jpg图片
  14. Python 练习005 ——疯狂填词程序
  15. 第五次网页前端培训笔记(javascript基础内容)
  16. Skype for Business Server与Microsoft Teams的长期共存模式
  17. 休闲食品线上与线下的差异化
  18. ajax、promise、react、缓存笔记记录
  19. zk-snark之R1CS-QAP
  20. 目标检测算法DSSD的原理详解

热门文章

  1. unity跳转场景变暗的解决办法
  2. 【Python】输入输出与运算符
  3. 自定义函数C语言编写x的n次方,c语言求x的n次方的函数是什么
  4. 一行代码实现音频变速不变调
  5. Scala中解析json工具对比
  6. 会计科目使用说明_A股财务数据的整理和使用
  7. 多久更换计算机密码比较安全,个人计算机密码设置要符合安全要求,并定期更换 - 作业在线问答...
  8. 鸿蒙开发板HI3518视频,HiSpark IPC DIY Camera HarmonyOS开发板 鸿蒙开发板 - 电子技术论坛...
  9. 京沈高铁轨道板安装RFID芯片,助力监控轨道状态
  10. 深入浅出~HashMap的底层原理透析