1. 创建一个类,实现统计文本文件中各类字符和字符串的个数的功能,要求实现:

a) 按字符统计,输出各个字符的数量

b) 按单词统计,输出各个单词的数量

2. 在b)的基础上实现一个类keywordIdentifier,读入一个Java程序源文件,输出各个关键字的个数(注释中出现的关键字不计入关键字个数)

思考:统计1:如果文本文件只包含26个英文字母并且用空格分离,那么只需要使用数组就可以对字符计数,用空格分离得到字符串可以对字符串计数(是否区分大小写问题)。如果文本文件是英文,但是包含各种标点及其他符号,则使用集合key-value的形式来对字符计数,按字符依次读取,然后将26个字母以外的所有字符作为空格处理,再使用空格将其分离,最后对字符串统计计数。

关键字统计:需要所有关键字集合,对每行判断是否为注释,再对非注释进行空格分离,对关键字计数(采用key-value形式)

1.统计字符和单词 StringCounter.java

import java.util.Map;
import java.util.TreeMap; public class StringCounter { private Map<String, Integer> charCount = new TreeMap<String, Integer>(); private Map<String, Integer> wordCount = new TreeMap<String, Integer>(); public void charCounter(String s) {
Integer freq;
for(int i = 0; i < s.length(); i++) {
freq = charCount.get(s.substring(i, i+1));
if(freq == null) {
freq = new Integer(1);
}
else {
freq = new Integer(freq.intValue() + 1);
}
charCount.put(s.substring(i, i+1), freq);
}
} public void wordCounter(String s) {
//将除过a-zA-Z0-9的其他符号转为空格,再将多个空格转为一个空格
String s1 = s.replaceAll("\\W", " ");
String s2 = s1.replaceAll(" +", " ");
String[] s3 = s2.split(" ");
Integer freq;
for(String str : s3) {
freq = wordCount.get(str);
if(freq == null) {
freq = new Integer(1);
}
else {
freq = new Integer(freq.intValue() + 1);
}
wordCount.put(str, freq);
}
} public void output() {
System.out.println(charCount);
System.out.println(wordCount);
}
}

2.测试 使用的文本文件为随意的英文文本

import java.io.IOException;
import java.io.RandomAccessFile; public class CountTest { public static void main(String[] args) throws IOException {
StringCounter sc = new StringCounter(); long filePoint = 0;
String s;
RandomAccessFile file = new RandomAccessFile("string.txt", "r");
long fileLength = file.length();
while(filePoint < fileLength) {
s = file.readLine();
//处理及计数
sc.charCounter(s);
sc.wordCounter(s);
filePoint = file.getFilePointer();
}
file.close(); sc.output();
} }

3.关键词统计

  先将所有关键字放入map中,以关键字为键,次数0为值,再读文本统计个数

import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Map;
import java.util.TreeMap; public class keywordIdentifier { private Map<String, Integer> keyWordCount = new TreeMap<String, Integer>(); public void keyWord() throws IOException {
long filePoint = 0;
String s;
RandomAccessFile file = new RandomAccessFile("keyword.txt", "r");
long fileLength = file.length();
while(filePoint < fileLength) {
s = file.readLine(); String[] s1 = s.split(" ");
Integer freq = new Integer(0);
for(String word : s1) {
keyWordCount.put(word, freq);
} filePoint = file.getFilePointer();
}
file.close();
} public void keyWordCounter(String s){
int pos = s.indexOf("//");
if(pos == -1) {
pos = s.length();
}
String sub = s.substring(0, pos);
     String sub1 = sub.replaceAll("\\W", " ");
String str = sub1.replaceAll(" +", " ");
String[] s1 = str.split(" ");
Integer freq;
for(String word : s1) {
freq = keyWordCount.get(word);
if(freq != null) {
freq = new Integer(freq.intValue() + 1);
keyWordCount.put(word, freq);
}
}
} public void output() {
System.out.println(keyWordCount);
} }

4.测试关键词统计

import java.io.*;

public class CountTest {

    public static void main(String[] args) throws IOException {
keywordIdentifier sc = new keywordIdentifier();
sc.keyWord();
long filePoint = 0;
String s;
RandomAccessFile file = new RandomAccessFile("CountTest.java", "r");
long fileLength = file.length();
while(filePoint < fileLength) {
s = file.readLine();
sc.keyWordCounter(s);
filePoint = file.getFilePointer();
}
file.close(); sc.output();
} }

输出:

{abstract=0, assert=0, boolean=0, break=0, byte=0, case=0, catch=0, char=0, class="1", const=0, continue=0, default=0, do=0, double=0, else=0, enum=0, extends=0, final=0, finally=0, float=0, for=0, goto=0, if=0, implements=0, import=1, instanceof=0, int=0, interface=0, long=2, native=0, new=2, package=1, private=0, protected=0, public=2, return=0, short=0, static=1, strictfp=0, super=0, switch=0, synchronized=0, this=0, throw=0, throws=1, transient=0, try=0, void=1, volatile=0, while=1}

文本统计器(Java)的更多相关文章

  1. Golang,用map写个单词统计器

    Golang中也有实用的泛型编程模板.如map.据Go官方团队称,其实现为Hash表,而非类似cpp或Java的红黑树.所以理论上速度更能快上几个等级(Hash与红黑树的效率对比可以看我的文章C++中 ...

  2. 软工之词频统计器及基于sketch在大数据下的词频统计设计

    目录 摘要 算法关键 红黑树 稳定排序 代码框架 .h文件: .cpp文件 频率统计器的实现 接口设计与实现 接口设计 核心功能词频统计器流程 效果 单元测试 性能分析 性能分析图 问题发现 解决方案 ...

  3. 给 VS 2010 选一个好用的代码行数统计器(转)

    给 VS 2010 选一个好用的代码行数统计器 分类: Tricks2011-02-25 05:40 3891人阅读 评论(0) 收藏 举报 2010c 推荐一个VS插件,支持2005/2008/20 ...

  4. Guava缓存器源码分析——缓存统计器

    Guava缓存器统计器实现: 全局统计器——         1.CacheBuilder的静态成员变量Supplier<StatsCounter> CACHE_STATS_COUNTER ...

  5. IntelliJ IDEA 2017版 编译器使用学习笔记(九)(图文详尽版);IDE使用的有趣的插件;IDE代码统计器;Mybatis插件

    一.代码统计器,按照名字搜索即可,在file===setting------plugin 使用右键项目:点击自动统计 二.json转实体类 三.自动找寻bug插件 四.Remind me工具 五.检测 ...

  6. java实现 比较两个文本相似度-- java 中文版 simHash 实现 ,

    比较两个文本的相似度 这里采用 simHash 算法 ; 分词是 基于 http://hanlp.linrunsoft.com/ 的开源 中文分词包 来实现分词 ; 实现效果图: 直接上源码: htt ...

  7. 算法笔记_086:蓝桥杯练习 9-2 文本加密(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 先编写函数EncryptChar,按照下述规则将给定的字符c转化(加密)为新的字符:"A"转化"B" ...

  8. 使用Swing组件编写一个支持中文文本编辑程序ChineseTextEdit.java

      import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; public class C ...

  9. 通过http路径获取文本内容(Java)

    public static String readFileByUrl(String urlStr) { String res = null; try { URL url = new URL(urlSt ...

随机推荐

  1. 题解——洛谷P2294 [HNOI2005]狡猾的商人(差分约束)

    裸的差分约束 dfs判断负环,如果有负环就false,否则就是true 注意有多组数据,数组要清空 #include <cstdio> #include <algorithm> ...

  2. [js] - js中类(伪)数组装正规数组

    今天的js中使用了自定义的原型方法去重后,再调用这个获取的去重的数组传入另一个含有for循环的方法时, console.log出错: dimensions:createTime,华联石化,海油石化,青 ...

  3. Docker:Deploy your app

    Prerequisites Install Docker. Get Docker Compose as described in Part 3 prerequisites. Get Docker Ma ...

  4. Shell: nohup守护进程化

    如果想在终端会话中启动shell脚本,然后让脚本一直以后台模式运行,直到其完成,即使你退出了终端会话,可以使用nohup命令实现.感觉nohup就是将一个进程初始化为一个守护进程. nohup命令运行 ...

  5. OpenLayers中的球面墨卡托投影

    最近看OpenLayers,研究到地图投影时找到官方的文档,就翻译了一下,由于英文能力差,翻译不好的地方,请看原文 原文地址:http://docs.openlayers.org/library/sp ...

  6. Python 全集变量

    1.添加关键字: global 在要给变量从新赋值的时候添加. 全局变量都大写,局部变量都小写.

  7. 用html+css+js实现选项卡切换效果

    文章转载自:http://tongling.github.io/JSCards/ 用html+css+js实现选项卡切换效果 使用之前学过的综合知识,实现一个新闻门户网站上的常见选项卡效果: 文字素材 ...

  8. Digits of Factorial LightOJ - 1045

    题目就不再发了,大致意思就是给你一个十进制数n,算出阶乘后转换成K进制的数,你来算一下它的位数. 坑点在哪呢,就是这个数可能算阶乘的时候没放弄了,比如1000000,做过最多单算阶乘的题也就是让你算到 ...

  9. django会话session

    因为因特网HTTP协议的特性,每一次来自于用户浏览器的请求(request)都是无状态的.独立的.通俗地说,就是无法保存用户状态,后台服务器根本就不知道当前请求和以前及以后请求是否来自同一用户.对于静 ...

  10. 力扣(LeetCode)976. 三角形的最大周长

    给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的.面积不为零的三角形的最大周长. 如果不能形成任何面积不为零的三角形,返回 0. 示例 1: 输入:[2,1,2] 输出:5 示例 2 ...