统计关键字个数(利用List、Map实现)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44213634/article/details/99432613
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;
	}
	
	
	
}





猜你喜欢

转载自blog.csdn.net/qq_44213634/article/details/99432613