《Thinking in Java》十七章_容器深入研究_练习12(Page484)
练习12:
练习使用HashMap / LinkedHashMap / TreeMap
1 import java.util.HashMap; 2 import java.util.LinkedHashMap; 3 import java.util.Map; 4 import java.util.TreeMap; 5 6 public class Main { 7 8 public static void main(String[] args) { 9 10 /*--------------- HashMap -------------------------*/ 11 12 Map<String,String> map1=new HashMap<String,String>(); 13 14 map1.put("sky","blue"); 15 map1.put("grass","green"); 16 map1.put("ocean","dancing"); 17 map1.put("tree","tall"); 18 map1.put("earth","brown"); 19 map1.put("sun","warm"); 20 map1.put("extra","object"); 21 22 log(map1); 23 log(map1.get("ocean")); 24 25 /*--------------- TreeMap -------------------------*/ 26 27 Map<String,String> map2=new TreeMap<String,String>(); 28 29 map2.put("sky","blue"); 30 map2.put("grass","green"); 31 map2.put("ocean","dancing"); 32 map2.put("tree","tall"); 33 map2.put("earth","brown"); 34 map2.put("sun","warm"); 35 map2.put("extra","object"); 36 37 log(map2); 38 log(map2.get("ocean")); 39 40 /*--------------- LinkedHashMap -------------------------*/ 41 42 Map<String,String> map3=new LinkedHashMap<String,String>(); 43 44 map3.put("sky","blue"); 45 map3.put("grass","green"); 46 map3.put("ocean","dancing"); 47 map3.put("tree","tall"); 48 map3.put("earth","brown"); 49 map3.put("sun","warm"); 50 map3.put("extra","object"); 51 52 log(map3); 53 log(map3.get("ocean")); 54 55 } 56 57 public static void log(Object ...args){ 58 for(int i=0;i<args.length;i++){ 59 System.out.print(args[i]+" "); 60 } 61 System.out.println(); 62 } 63 64 }
单词统计的一般过程:
使用HashMap的实现如下:
1 import java.io.BufferedReader; 2 import java.io.FileInputStream; 3 import java.io.FileNotFoundException; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 import java.io.UnsupportedEncodingException; 7 import java.util.HashMap; 8 import java.util.Map; 9 10 public class Main { 11 12 public static void main(String[] args) { 13 14 String path="E:/英语/阅读训练/哈利波特英文版1-7全集/1.Harry Potter and the Sorcerer's Stone.txt"; 15 16 Map<String,Integer> map=wordCount(path); 17 18 for(String s:map.keySet()){ 19 System.out.printf("%s=%d\n",s,map.get(s)); 20 } 21 22 } 23 24 public static Map<String,Integer> wordCount(String filePath){ 25 26 BufferedReader reader=null; 27 Map<String,Integer> map=new HashMap<String,Integer>(); 28 29 try { 30 reader=new BufferedReader(new InputStreamReader(new FileInputStream(filePath),"UTF-8")); 31 32 StringBuilder sb=new StringBuilder(); 33 34 String s=reader.readLine(); 35 while(s!=null){ 36 sb.append(s); 37 s=reader.readLine(); 38 } 39 40 //先进行预处理,然后再分割 41 String words[]=preprocess(sb.toString()).split("\\s{1,}"); 42 43 //统计词频 44 for(String e:words){ 45 if("".equals(s)) continue; 46 Integer t=map.get(e); 47 map.put(e,t==null?1:t+1); 48 } 49 50 } catch (UnsupportedEncodingException e) { 51 e.printStackTrace(); 52 } catch (FileNotFoundException e) { 53 e.printStackTrace(); 54 } catch (IOException e) { 55 e.printStackTrace(); 56 }finally{ 57 try { 58 if(reader!=null) reader.close(); 59 } catch (IOException e) { 60 e.printStackTrace(); 61 } 62 } 63 64 return map; 65 } 66 67 //对内容进行预处理,去除一些干扰元素之类的 68 public static String preprocess(String s){ 69 return s.replaceAll("\\s{1,}"," ").replaceAll("[,.'\"?!-;*]"," ").toLowerCase(); 70 } 71 72 }