五、Map集合的应用及扩展 1、何时使用Map集合:当量数据之间存在着映射关系的时候,就应该想到使用Map集合。 2、示例: 获取该字符串中的字母出现的次数,如:"sjokafjoilnvoaxllvkasjdfns";希望打印的结果是:a(3)c(0)..... 通过结果发现,每个字母都有对应的次数,说明字母和次数之间有映射关系。代码如下: - 1. /*
- 2. 思路:1、将字符串转换为字符数组
- 3. 2、定义一个TreeMap集合,用于存储字母和字母出现的次数
- 4. 3、用数组去遍历集合,如果集合中有该字母则次数加1,如果集合中没有则存入
- 5. 4、将TreeMap集合中的元素转换为字符串
- 6. */
- 7. package TreeMapTest;
- 8. import java.util.*;
- 9.
- 10. class CharCount
- 11. {
- 12. public static void main(String[] args)
- 13. {
- 14. String s="sdfgzxcvasdfxcvdf";
- 15. System.out.println("s中各字母出现的次数:"+charCount(s));
- 16. }
- 17.
- 18. //定义一个方法获取字符串中字母出现的次数
- 19. public static String charCount(String str)
- 20. {
- 21. char[] cha=str.toCharArray();//转换为字符数组
- 22.
- 23. //定义一个TreeMap集合,因为TreeMap集合会给键自动排序
- 24. TreeMap<Character,Integer> tm=new TreeMap<Character,Integer>();
- 25.
- 26. int count=0;//定义计数变量
- 27. for (int x=0;x<cha.length ;x++ )
- 28. {
- 29. if(!(cha[x]>='a'&&cha[x]<='z'||cha[x]>='A'&&cha[x]<='Z'))
- 30. continue;//如果字符串中非字母,则不计数
- 31. Integer value=tm.get(cha[x]);//获取集合中的值
- 32. if(value!=null)//如果集合中没有该字母,则存入
- 33. count=value;
- 34. count++;
- 35. tm.put(cha[x],count);//存入键值对
- 36. count=0;//复位计数变量
- 37. }
- 38.
- 39. StringBuilder sb=new StringBuilder();//定义一个容器
- 40.
- 41. //遍历集合,取出并以题目格式存入容器中
- 42. for(Iterator<Character> it=tm.keySet().iterator();it.hasNext();)
- 43. {
- 44. Character ch=it.next();
- 45. Integer value=tm.get(ch);
- 46. sb.append(ch+"("+value+")");
- 47. }
- 48. return sb.toString();//返回字符串
- 49. }
- 50. }
复制代码六、Map扩展知识 在很多项目中,应用比较多的是一对多的映射关系,这就可以通过嵌套的形式将多个映射定义到一个大的集合中,并将大的集合分级处理,形成一个体系。 如: - 1. /*
- 2. map扩展知识。
- 3. map集合被使用是因为具备映射关系。
- 4. 以下是班级对应学生,而学生中学号对应着姓名的映射关系:
- 5. "yureban" Student("01" "zhangsan");
- 6.
- 7. "yureban" Student("02" "lisi");
- 8.
- 9. "jiuyeban" "01" "wangwu";
- 10. "jiuyeban" "02" "zhaoliu";
- 11.
- 12. 就如同一个学校有多个教室。每一个教室都有名称。
- 13. */
- 14. import java.util.*;
- 15.
- 16. class MapExpandKnow
- 17. {
- 18. public static void main(String[] args)
- 19. {
- 20. //预热班集合
- 21. HashMap<String,String> yureban=new HashMap<String,String>();
- 22. //就业班集合
- 23. HashMap<String,String> jiuyeban=new HashMap<String,String>();
- 24. //学校集合
- 25. HashMap<String,HashMap<String,String>> czbk=new HashMap<String,HashMap<String,String>>();
- 26.
- 27. //学校中班级集合和名称的映射
- 28. czbk.put("yureban",yureban);
- 29. czbk.put("jiuyueban",jiuyeban);
- 30.
- 31. //预热班级中学号与姓名的映射
- 32. yureban.put("01","zhangsan");
- 33. yureban.put("02","lisi");
- 34.
- 35. //就业班级中学号与姓名的映射
- 36. jiuyeban.put("01","wangwu");
- 37. jiuyeban.put("02","zhouqi");
- 38.
- 39. //直接显示全部学生信息
- 40. getAllStudentInfo(czbk);
- 41.
- 42. }
- 43. //定义一个方法获取全部学生信息,包括在哪个班级,叫什么名字,学号多少
- 44. public static void getAllStudentInfo(HashMap<String ,HashMap<String,String>> hm)
- 45. {
- 46. for (Iterator<String> it=hm.keySet().iterator();it.hasNext() ; )//用keySet取出方式
- 47. {
- 48. String s= it.next();//班级名称
- 49. System.out.println(s+":");
- 50. HashMap<String,String> stu=hm.get(s);//班级集合
- 51.
- 52. getStudentInfo(stu);
- 53. }
- 54. }
- 55.
- 56. //获取班级中学生的信息,包括姓名和学号
- 57. public static void getStudentInfo(HashMap<String,String> hm)
- 58. {
- 59. for (Iterator<String> it=hm.keySet().iterator();it.hasNext() ; )
- 60. {
- 61. String key=it.next();//学号
- 62. String value=hm.get(key);//姓名
- 63. System.out.println(key+"..."+value);
- 64. }
- 65. }
- 66. }
复制代码 |