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

    xiaoxiao2021-04-16  48

    需求:通过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(); } }

    转载请注明原文地址: https://ju.6miu.com/read-672526.html

    最新回复(0)