主要实现计数
java.util.Map
------->java.util.HashMap ------->java.util.TreeMap ------->java.util.Hashtablejava.util.HashMap(key/value)1.基本操作直接打印Map对象会打印key的toString=value的toStringget(key)得到valuecontainsKey(key) 是否包含key遍历方式1:把Map中所有的key都放入了Set集合,然后遍历Set
得到key,通过key获取valueSet set = map对象.keySet()遍历方式2:放入HashMap集合中的key,value其实都会被包装成 Map.Entry这个内部类的属性,有一个健值对就存在一个 Map.Entry的实例对象,通过entrySet()方法就可以把 这些实例对象都放入Set集合中,遍历Set获取每个对象Set set = Map对象.entrySet(); 2.用HashMap的泛型实现基本操作避免强制类型转换3.map.put(keyvalue) 如果key相同,那么value会覆盖之前的value (如何才能判定key是否相同,注意equals和hashCode的实现) 这个特点特别适合用来做计数 案例:计算每个字符出现的次数 String s = "wwqajegjasrhgoihasijgolihaseg"; 思路:拿到每个字符,作为key放入HashMap中 如果map中不存在,那么put(key,1) 如果已经存在那么put(key,value+1)4.HashMap的数据结构(数组+链表的结构)
分析源代码 1).HashMap包含了一个Entry(key,value,next,hash)的内部类 key/value放入HashMap的时候会被包装秤Entry对象 2).HashMap成员就有Entry的数组,该数组的大小默认是12,永远是2的次防暑,如果自己 给的不是2的次方数,会转换成大于并最接近自己给出的2的次方数 put(key,value)时就是转换成Entry对象并放入数组中 3).put(key,value)方法的时下 a.根据key的hashCode进行hash运算(该算法不用关心)得到值hash b.根据hash值去确定数组的位置 hash & (table.length-1)等价于hash%table.length length是2的次方数。正好获取了数组的位置
一、未加泛型的HashMap
HashMap的元素添加和遍历
1 import java.util.HashMap; 2 import java.util.Map; 3 import java.util.Set; 4 5 6 public class HashMapDemo { 7 public static void main(String[] args) { 8 HashMap aa=new HashMap(); 9 User1 user=new User1("0001","zhangsan",10);10 User1 user1=new User1("0002","lisi",11);11 User1 user2=new User1("0003","wangmazi",12);12 User1 user3=new User1("0004","xiaowang",13);13 aa.put(user.id, user);14 aa.put(user1.id, user1);15 aa.put(user2.id, user2);16 aa.put(user3.id, user3);17 //打印元素数量18 System.out.println(aa.size());19 /*遍历20 * 方法一21 */22 User1 user4=(User1)aa.get("0001");23 /*方法二24 * */25 Set jj=aa.keySet();26 for (Object object : jj) {27 User1 user5=(User1)aa.get(object);28 System.out.println(user5);29 }30 /*方法三31 * */32 Set set=aa.entrySet();33 for (Object object : set) {34 Map.Entry as=(Map.Entry)object;35 System.out.println(as.getKey()+" "+as.getValue());36 }37 }38 }39 class User1{40 String id;41 String name;42 int age;43 public String getId() {44 return id;45 }46 public void setId(String id) {47 this.id = id;48 }49 public String getName() {50 return name;51 }52 public void setName(String name) {53 this.name = name;54 }55 public int getAge() {56 return age;57 }58 public void setAge(int age) {59 this.age = age;60 }61 62 public User1() {}63 public User1(String id, String name, int age) {64 super();65 this.id = id;66 this.name = name;67 this.age = age;68 }69 @Override70 public String toString() {71 // TODO Auto-generated method stub72 return this.name;73 }74 } 打印结果:
4
xiaowangzhangsanwangmazilisi0004 xiaowang0001 zhangsan0003 wangmazi0002 lisi二、加入泛型的HashMap
1 import java.util.HashMap; 2 import java.util.Map; 3 import java.util.Set; 4 public class dg { 5 public static void main(String[] args) { 6 HashMapstudent=new HashMap (); 7 Student a=new Student("001","zhangsan",10); 8 Student a1=new Student("002","lisi",11); 9 Student a2=new Student("003","wangmazi",12);10 student.put(a.getId(), a);11 student.put(a1.getId(), a1);12 student.put(a2.getId(), a2);13 14 //遍历:方法一15 Student s=student.get("001");16 System.out.println(s);17 // 方法二18 Set set=student.keySet();19 for (String string : set) {20 Student s1=student.get(string);21 System.out.println(s1);22 }23 // 方法三24 Set > a11= student.entrySet();25 for (Map.Entry entry : a11) {26 System.out.println(entry.getValue());27 }28 }29 }30 class Student{31 String id;32 String name;33 int age;34 public String getId() {35 return id;36 }37 public void setId(String id) {38 this.id = id;39 }40 public String getName() {41 return name;42 }43 public void setName(String name) {44 this.name = name;45 }46 public int getAge() {47 return age;48 }49 public void setAge(int age) {50 this.age = age;51 }52 53 public Student() {}54 public Student(String id, String name, int age) {55 super();56 this.id = id;57 this.name = name;58 this.age = age;59 }60 @Override61 public String toString() {62 63 return this.id+"=="+this.name;64 }65 } 打印结果
001==zhangsan
001==zhangsan002==lisi003==wangmazi001==zhangsan002==lisi003==wangmazi
三、计数器
1 import java.util.HashMap; 2 public class jsq { 3 public static void main(String[] args) { 4 String s="aaaaaabbbbbbbbbbbbbcccccccccccccjjjjjjjjjj"; 5 HashMapsd=new HashMap (); 6 7 for (int i = 0; i < s.length(); i++) { 8 String dd=s.substring(i,i+1); 9 if(sd.containsKey(dd)){10 sd.put(dd, sd.get(dd)+1);11 }else{12 sd.put(dd, 1);13 }14 }System.out.println(sd);15 }16 } 打印结果:{b=13, c=13, a=6, j=10}
四、计数排序
要求:记录String类中的字母个数,并将个数从小到大排序
1 import java.util.Comparator; 2 import java.util.HashMap; 3 import java.util.Set; 4 import java.util.TreeSet; 5 public class jsq { 6 public static void main(String[] args) { 7 String s="aaaaaabbbbbbbbbbbbbbcccccccccccccjjjjjjjjjj"; 8 HashMapsd=new HashMap (); 9 10 for (int i = 0; i < s.length(); i++) {11 String dd=s.substring(i,i+1);12 if(sd.containsKey(dd)){13 sd.put(dd, sd.get(dd)+1);14 }else{15 sd.put(dd, 1);16 }17 }System.out.println(sd.toString());18 TreeSet aag=new TreeSet (new aa());19 Set aa=sd.keySet();20 System.out.println(aa);21 Integer a=sd.get("b");22 System.out.println(a);23 for (String string : aa) {24 Integer ay=sd.get(string);25 aag.add(ay);26 }27 System.out.println(aag);28 }29 }30 class aa implements Comparator {31 32 public int compare(Integer o1, Integer o2) {33 if(!o1.equals(o2)){34 return o1-o2;35 }36 return 0;37 }38 } 输出结果:
{b=14, c=13, a=6, j=10}
[6, 10, 13, 14]