版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
package NumberOfStatisticalKeywords;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
/**
* 主要思路:
* 1、创建一个文件输入流 来读取指定源文件中的内容 将内容赋值给字符串然后返回
* 2、创建一个集合 来存放返回的字符串
* 3、创建关键字的字符串数组 再将字符串数组转化为集合
* 5、创建一个map数组 来存放对应的键值
* 4、使用双循环来统计关键字在每行字符串中的个数
* @author 李*文
* @version 1.8
* @date 2019年8月13日 上午10:02:32
* @content JAVA代码
* @motto 代码千万条,可读第一条。代码不规范,error多两行。
*/
public class FileSourceCount {
//存放源代码的文件的路径
public static final String filePath="c://test/count.txt";
public static void main(String[] args) {
mainFun();
}
public static void mainFun()
{
//进行集合的接收
List<String> contentlist=FileSourceCount(filePath);
// for (String str : contentlist) {
// System.out.println(str);
// }
//创建一个包含关键字的字符串
final String keywords = "package, import, public, class, void, final,"
+ " static, new, while, if, catch, for, try, return";
//将其转换为set集合
Set<String> keyWordsSet=new HashSet<>();
//创建一个Map集合
Map<String ,Integer> keyWordMap=new HashMap<>();
keyWordsSet.addAll(Arrays.asList(keywords.split(",")));
//使用双循环对字符串中关键字的个数进行统计
for (String key : keyWordsSet) {
key=key.trim();
for( String line: contentlist)
{
int count=getCount(key, line);
if(count==0)
continue;
//判断 map数组中是否已经包含此关键字与其对应的键值
if(keyWordMap.containsKey(key))
{
int oldCount=keyWordMap.get(key).intValue();
keyWordMap.put(key,new Integer(oldCount+count));
}
else
{ //关键字第一次出现 直接添加即可
keyWordMap.put(key,count);
}
}
}
//进行map数组的遍历
System.out.println("结果为:");
// for (String key : keyWordMap.keySet()) {
// System.out.println(key+"->"+keyWordMap.get(key));
// }
System.out.println("未排序的结果为:");
//
// for (String i : keyWordMap.keySet()) {
// System.out.println(i+"->"+keyWordMap.get(i));
// }
// for (String i : keyWordMap.keySet()) {
// System.out.println(i+"->"+keyWordMap.get(i));
// }
for (Entry<String,Integer> entry : keyWordMap.entrySet()) {
System.out.println(entry.getKey()+"->"+entry.getValue());
}
System.out.println("进行排序后的结果为:");
System.out.println("--------------------------------------------");
Map<String, Integer> treeMap = new TreeMap<>(new compareToInteger(keyWordMap));
treeMap.putAll(keyWordMap);
for(Entry<String, Integer> entry : treeMap.entrySet()){
System.out.println(entry.getKey() + "->" + entry.getValue());
}
}
public static List<String> FileSourceCount(String fileName)
{
List<String> content=new ArrayList<>();
String line=null;
Reader reader=null;
BufferedReader bReader=null;
try {
reader=new FileReader(filePath);
bReader=new BufferedReader(reader);
//进行文件内容的读取
try {
while((line=bReader.readLine())!=null)
{ //去掉空行
if(line.trim().length() == 0||line.trim().length() == 1) continue;
//去掉两边的空格
content.add(line);
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
finally{
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
bReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return content;
}
public static int getCount(String keyWord,String line){
if(line==null||line.length()==0)
return 0;
if(line.startsWith("//")||line.startsWith("*")||line.startsWith("*/")||line.startsWith("/*"))
return 0;
int index=-1;
int count=0;
String strLine= new String(line);
while((index = strLine.indexOf(keyWord)) != -1){
count++;
strLine = strLine.substring(index + keyWord.length());
}
return count;
}
}
/**
* 自己定义的比较器
* 注意:默认情况下,Map的比较器只能对key进行排序
* 根据值比较:需要自定义属性
* @author 李*文
* @version 1.8
* @date 2019年8月13日 下午2:19:01
* @content JAVA代码
* @motto 代码千万条,可读第一条。代码不规范,error多两行。
*/
class compareToInteger implements Comparator<String>{
//创建一个私有属性
private Map<String,Integer> map;
//创建一个构造方法
public compareToInteger(Map<String,Integer> map)
{
this.map=map;
}
@Override
public int compare(String obj1, String obj2) {
if(map.get(obj1).intValue()>map.get(obj2).intValue())
return 1;
else if(map.get(obj1).intValue()<map.get(obj2).intValue())
return -1;
else
return 0;
}
}