利用HashMap实现分拣存储,可以简单理解成往特定的袋子里装东西。举个例子,装苹果的袋子里只能往里丢苹果,装橘子的袋子里只能往里丢橘子。
以下代码的作用是统计一段英文句子里每个单词出现的次数。
解决思路:
1.把句子分割成单词存进数组里;
2.遍历这个数组,把单词存进HashMap里。HashMap里的key就是每个单词,value就是单词出现的次数。value的值也可以是一个对象,对象里有关于次数的属性。
3.最后就是通过迭代器查看每个单词出现的次数。
第1种解决办法:HashMap的value直接存单词出现次数
1 package com.bjsxt.map; 2 3 import java.util.HashMap; 4 import java.util.Iterator; 5 import java.util.Map; 6 import java.util.Set; 7 8 /** 9 * 分拣存储:1:N 10 * 统计单词出现的次数 11 * this is a cat and that is a mice and where is the food ? 12 * 思路 13 * 1.分割字符串 14 * 2.分拣存储 15 * 3.按要求查看单词出现的次数 16 * 17 * 18 */ 19 public class MapDemo01 { 20 public static void main(String[] args) { 21 //1.分割字符串 22 String[] arr = "this is a cat and that is a mice and where is the food ?".split(" "); 23 //2.分拣存储 24 Map<String,Integer> map = new HashMap<String,Integer>(); 25 for(String key:arr) { 26 // System.out.println(key ); //打印每个单词 27 /*if(!map.containsKey(key)) { //查看是否存在该单词 28 map.put(key, 1); 29 } else { //存在 30 map.put(key, map.get(key)+1); 31 }*/ 32 Integer value = map.get(key); 33 if(null == value) { //不存在 34 map.put(key, 1); 35 } else { 36 map.put(key, value+1); 37 } 38 } 39 //3.查看每个单词出现的次数 40 Set<String> keySet = map.keySet(); 41 //获取迭代器对象 42 Iterator<String> it = keySet.iterator(); 43 while(it.hasNext()) { 44 String key = it.next(); 45 Integer value = map.get(key); 46 System.out.println(key+"-->"+value); 47 } 48 } 49 }
第2种解决办法:HashMap的value存一个对象
首先,建一个Letter类,包含成员变量name和count,还有构造器,getter与setter方法。这里裴新老师还介绍了一些Eclipse的快捷键。
1 package com.bjsxt.map; 2 3 /** 4 * javabean 存储数据 po bo vo 包含setter与getter访问器的类 5 * 6 */ 7 public class Letter { 8 private String name; //单词 9 private int count; //次数 10 11 //alt+/ 快捷键 生成空构造器 12 public Letter() { 13 } 14 15 public Letter(String name) { 16 super(); 17 this.name = name; 18 } 19 20 //alt+shift+s --> o 快捷键 生成带参构造器 21 public Letter(String name, int count) { 22 super(); 23 this.name = name; 24 this.count = count; 25 } 26 27 //setter与getter 28 public static void main(String[] args) { 29 30 } 31 32 public String getName() { 33 return name; 34 } 35 36 public void setName(String name) { 37 this.name = name; 38 } 39 40 public int getCount() { 41 return count; 42 } 43 44 public void setCount(int count) { 45 this.count = count; 46 } 47 }
然后,我们进行分拣存储:
1 package com.bjsxt.map; 2 3 import java.util.HashMap; 4 import java.util.Iterator; 5 import java.util.Map; 6 import java.util.Set; 7 8 /** 9 * 分拣存储:1:N 10 * 统计单词出现的次数 11 * this is a cat and that is a mice and where is the food ? 12 * 思路 13 * 1.分割字符串 14 * 2.分拣存储 15 * 3.按要求查看单词出现的次数 16 * 4.加入面向对象 17 * 18 * 19 */ 20 public class MapDemo02 { 21 public static void main(String[] args) { 22 //1.分割字符串 23 String[] arr = "this is a cat and that is a mice and where is the food ?".split(" "); 24 //2.分拣存储 25 Map<String,Letter> map = new HashMap<String,Letter>(); 26 for(String key:arr) { 27 /* 28 //第一次查看是否 存在袋子 29 if(!map.containsKey(key)) { //不存在 30 map.put(key, new Letter(key)); //准备好袋子 31 } 32 //获取袋子 33 Letter value = map.get(key); 34 value.setCount(value.getCount()+1); //装东西 35 */ 36 Letter value = map.get(key); 37 if(null==value) { 38 value = new Letter(key); 39 map.put(key, value); 40 } 41 value.setCount(value.getCount()+1); //装东西 42 } 43 //3.查看每个单词出现的次数 44 for(String key:map.keySet()) { 45 Letter value = map.get(key); 46 System.out.println(key+"-->"+value.getCount()); 47 } 48 49 } 50 }