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