java实验2.(4)(5)HashMap,TreeMap统计字符频率

需求:通过HashMap统计poem.txt中每个字符的出现频率,要求不包含标点符号(;, .。,.;)、空格' '、回车 '\r'、换行'\n'tab字符'\t'、数字0~9(大于'0'小于'9')。

1)利用for语句找出“春”, “秋”,“日”,“月”,“山”, “水”, “夜”的出现频率。

2)通过遍历的方法把出现次数10次及以上的字显示出来。

   基本思路:使用HashMap放置拥有的字符,更新字符频率,再Put入一个新的值,就可以覆盖原来的键值对。

   代码:

import java.io.*;
import java.util.*;

public class MapTest1{
  public static void main(String[] args)throws IOException{
     char keys[] ={'春','秋','日','月','山','水','夜'}; 
     String content = readFile(".\\poem.txt");
	 HashMap<Character, Integer> map = new HashMap<Character, Integer>();
	 for(int i = 0 ; i < content.length() ; i++)
	 {
		 Character temp = new Character(content.charAt(i));
		 if(isAsked(temp))
		 {
			 if(map.containsKey(temp))
			{
				int k = (map.get(temp));
				map.put(temp,k+1);
			}
			else 
			{
				map.put(temp,1);
			} 
		 } 
	 }
	 
	 Iterator<Character> it= map.keySet().iterator(); 
	 while (it.hasNext()) 
	{
		Character key = (Character) it.next();
		Integer value = map.get(key); // 根据
		if (text1(key))
			 System.out.println(key + " " + value);
		 
	}
	
	 Iterator<Character> it2= map.keySet().iterator(); 
	 while (it2.hasNext()) 
	{
		Character key = (Character) it2.next();
		Integer value = map.get(key); // 根据
		if (value > 10 ) 
			 System.out.println(key + " " + value);
		 
	}
  }
	static boolean isAsked(char c)
	{
		if( c == ';' || c == ',' ||c == '.' ||c == '。' ||c == ',' ||c == ';' ||c == ' ' ||c == '\r' ||c == '\n' ||c == '\n' ||
		c == '\t') return false;
		if( c - '0' >= 0 &&  c - '0' <= 9) return false;
		return true;
	}
	
	static boolean text1(char c) //accodring to the ask of test1
	{
		if( c == '春' || c == '秋' ||c == '日' ||c == '月' ||c == '山' ||c == '水' ||c == '夜') return true;
		return false;
	}
	
  static String readFile(String fileName) throws IOException{
    	StringBuilder sb = new StringBuilder("");
        String s1="";
	int c1;
	FileInputStream f1= new FileInputStream(fileName);		
	InputStreamReader in = new InputStreamReader(f1, "UTF-8");

	while ((c1 = in.read()) != -1) {
	  sb.append((char) c1);
	}        
        return sb.toString();
  }
}

5)需求:

在上题的基础上要求用TreeMap按照出现频率对所有字进行排序,然后按照出现频率从大到小显示出来。* 把出现频率作为key,具有相同频率的字符用逗号隔开作为value

显示方式:  

字符1  次数

字符2  次数...

 * 要求采用String.split()StringBuilder.insert()转序(把原来从小到大的顺序变为从大到小的顺序)。注意加入回车符'\n'。

实现思路:

  在上面的基础上得到了hashMap,2层循环遍历hashmap,将同一个value的key都用一个stringBuilder存储下来,再用一个TreeMap存储对应的频率和这个stringBuilder对,接着将TreeMap中每个键值对加入一个stringBuilder,用回车符\n,利用split函数分割成数组,从大到小输出就可以了。

  一个注意点:map的键值对的遍历方式:

for (Map.Entry<Integer, Integer> entry : map.entrySet())

参考至——http://blog.csdn.net/tjcyjd/article/details/11111401

实现代码如下:

import java.io.*;
import java.util.*;

public class MapTest2{
  public static void main(String[] args)throws IOException
  {
     String content = readFile(".\\poem.txt");
	 HashMap<Character, Integer> map = new HashMap<Character, Integer>();
	 for(int i = 0 ; i < content.length() ; i++)
	 {
		 Character temp = new Character(content.charAt(i));
		 if(isAsked(temp))
		 {
			 if(map.containsKey(temp))
			{
				int k = (map.get(temp));
				map.put(temp,k+1);
			}
			else 
			{
				map.put(temp,1);
			} 
		 } 
	 }
	 TreeMap<Integer,String> treeMap = new TreeMap<Integer,String>();
	for(Map.Entry<Character,Integer>entry:map.entrySet())
	{
		Integer value=entry.getValue();
		StringBuilder tmp=new StringBuilder("");
		 for(Map.Entry<Character, Integer>entry2:map.entrySet())
		 {
			if(value==entry2.getValue())
			{
				if(entry2.getKey()==' ') continue;
				tmp.append(entry2.getKey()+",");
			}
		}
		tmp.deleteCharAt(tmp.length()-1);//最后加的那个逗号
		treeMap.put(value, tmp.toString());
	}
	StringBuilder result=new StringBuilder("");
	 Iterator<Integer>it=treeMap.keySet().iterator();
	for(Map.Entry<Integer, String>entry:treeMap.entrySet()) //把结果放入一个StringBuilder中
	{
		String tmp="frequency:"+entry.getKey()+" char:"+entry.getValue();
		result.append(tmp+"\n");
		  
	}
	result.deleteCharAt(result.length()-1);//
	String[] datas=result.toString().split("\n");//Stringbuilder通过换行符划分成字符串数组
	for(int index=datas.length-1;index>=0;index--)
	{
		System.out.println(datas[index]);
	}
  }
	static boolean isAsked(char c)
	{
		if( c == ';' || c == ',' ||c == '.' ||c == '。' ||c == ',' ||c == ';' ||c == ' ' ||c == '\r' ||c == '\n' ||
		c == '\t') return false;
		if( c - '0' >= 0 &&  c - '0' <= 9) return false;
		return true;
	}
	
	static boolean text1(char c) //accodring to the ask of test1
	{
		if( c == '春' || c == '秋' ||c == '日' ||c == '月' ||c == '山' ||c == '水' ||c == '夜') return true;
		return false;
	}
	
	static String readFile(String fileName) throws IOException
	{
    	StringBuilder sb = new StringBuilder("");
        String s1="";
		int c1;
		FileInputStream f1= new FileInputStream(fileName);		
		InputStreamReader in = new InputStreamReader(f1, "UTF-8");

		while ((c1 = in.read()) != -1) {
			sb.append((char) c1);
		}        
		return sb.toString();
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值