黑马程序员-Java API-day16

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------


1、Map集合概述

接口Map<K,V>

类型参数:

K:此映射所维护的键的类型

V:映射值的类型

将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。

Map集合:该集合存储键值对。一对一对往里存,而且要保证键的唯一性。

       1.添加

              put(K key, V value)

              putAll(Map<? extends K,? extends V>m)

       2.删除

              clear()

              remove(Object key)

       3.判断

              containsValue(Object value)

              containsKey(Object key)

              isEmpty()

       4.获取

              get(Object key)

              size()

              value()

 

2、Map子类对象特点

Map

       |--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的,jdk1.0效率低

       |--HashMap:底层是哈希表数据结构,允许存入null键null值。该集合线程不同步的,jdk1.2效率高。

       |--TreeMap:底层是二叉树数据结构,线程不同步,可以用于各map集合中的键进行排序。

map和Set很像,其实Set底层就是使用了Map集合。

Hashtable用作键的对象必须实现hashCode方法和equals方法。

import java.util.*;
class MapDemo
{
       public static void main(String[] args)
       {
              Map<String,String> map = new HashMap<String,String>();
              //添加元素,如果出现相同的键,那么后添加的值会覆盖原有键对应值,并put方法会返回被覆盖的值。
              System.out.println("put:"+map.put("01","zhangsan01"));
              System.out.println("put:"+map.put("01","wangwu"));
              map.put("02","zhangsan02");
              map.put("03","zhangsan03");
 
              System.out.println("containsKey:"+map.containsKey("02"));
              //System.out.println("remove:"+map.remove("02"));
              map.put("04",null);
              System.out.println("get:"+map.get("04"));
              //可以通过get方法的返回值来判断一个键是否存在,通过返回null来判断。
             
              //获取Map集合中所有的值
              Collection<String> coll =map.values();
              System.out.println(coll);
              System.out.println(map);
       }
}

3、Map-keySet

map集合的两种取出方式:

Set<k> keySet:将map中所有的键存入到Set集合,因为set具备迭代器,所以可以用迭代的方式取出所有的键,再根据get方法,获取每一个键所对应的值。

Map集合的取出原理:将map集合转成set集合,再通过迭代器取出。

 

4、Map-Entry

Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到set集合中,而这个关系的数据类型就是:Map.Entry

import java.util.*;
class MapDemo2
{
       public static void main(String[] args)
       {
              Map<String,String> map = new HashMap<String,String>();
              map.put("01","zhangsan01");
              map.put("02","zhangsan02");
              map.put("03","zhangsan03");
              map.put("04","zhangsan04");
 
 
              //将Map集合中的映射关系取出,存入到Set集合中。
              Set<Map.Entry<String,String>>entrySet = map.entrySet();
 
              Iterator<Map.Entry<String,String>>it = entrySet.iterator();
 
              while(it.hasNext())
              {
                     Map.Entry<String,String>me = it.next();
                     Stringkey = me.getKey();
                     Stringvalue = me.getValue();
                     System.out.println(key+":"+value);
              }
 
              /*
              //先获取map集合的所有键的Set集合,keySet()
              Set<String> keySet = map.keySet();
 
              //有了Set集合,就可以获取其迭代器
              Iterator<String> it =keySet.iterator();
              while(it.hasNext())
              {
                     Stringkey = it.next();
                     //有了键就可以通过map集合的get方法获取其对应的值。
                     Stringvalue = map.get(key);
                     System.out.println("key:"+key+",value:"+value);
              }
              */
       }
}

5、Map练习

每一个学生都有对应的归属地,学生Student,地址String,

学生属性:姓名,年龄注意:姓名和年龄相同的视为同一个学生。保证学生的唯一性。

1.描述学生;

2.定义map容器,将学生作为键,地址作为值,存入。

3.获取map集合中的元素。

实现(implements)覆盖(hashcode,equals)两方法

import java.util.*;
class Student implementsComparable<Student>
{
       private String name;
       private int age;
       Student(String name,int age)
       {
              this.name = name;
              this.age = age;
       }
       public int compareTo(Student s)
       {
              int num = new Integer(this.age).compareTo(new Integer(s.age));
              if(num==0)
              {
                     return this.name.compareTo(s.name);
              }
              return num;
       }
       public int hashCode()
       {
              return name.hashCode()+age*23;
       }
       public boolean equals(Object obj)
       {
              if(!(obj instanceof Student))
                     throw new ClassCastException("类型不匹配");
              Student s = (Student)obj;
              return this.name.equals(s.name)&& this.age==s.age;
       }
       public String getName()
       {
              return name;
       }
       public int getAge()
       {
              return age;
       }
       public String toString()
       {
              return name+":"+age;
       }
}
 
class MapTest
{
       public static void main(String[] args)
       {
              HashMap<Student,String> hm = new HashMap<Student,String>();
              hm.put(new Student("lisi1",21),"beijing");
              hm.put(new Student("lisi2",22),"shanghai");
              hm.put(new Student("lisi3",23),"nanjing");
              hm.put(new Student("lisi4",24),"wuhan");
              hm.put(new Student("lisi5",25),"xizang");
 
              //第一种取出方式keySet
              Set<Student> keySet = hm.keySet();
              Iterator<Student> it = keySet.iterator();
 
              while(it.hasNext())
              {
                     Student stu = it.next();
                     String addr = hm.get(stu);
                     System.out.println(stu+"..."+addr);
              }
 
              //第二种取出方式entrySet
              Set<Map.Entry<Student,String>>entrySet = hm.entrySet();
              Iterator<Map.Entry<Student,String>>iter = entrySet.iterator();
 
              while(iter.hasNext())
              {
                     Map.Entry<Student,String>me = iter.next();
                     Student stu = me.getKey();
                     String addr = me.getValue();
                     System.out.println(stu+"------"+addr);
              }
       }
}


需求:对学生对象的年龄进行升序排序

因为数据是以键值对形式存在的,所以要使用可以排序的Map集合:TreeMap。

import java.util.*;
class StuNameComparator implementsComparator<Student>
{
       public int compare(Student s1,Student s2)
       {
              int num =s1.getName().compareTo(s2.getName());
              if(num==0)
              {
                     return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
              }
              return num;
       }
}
class MapTest2
{
       public static void main(String[] args)
       {
              TreeMap<Student,String> tm = newTreeMap<Student,String>(new StuNameComparator());
              tm.put(new Student("alisi3",23),"nanjing");
              tm.put(new Student("lisi1",21),"beijing");
              tm.put(new Student("lisi1",21),"tianjing");
              tm.put(new Student("clisi4",24),"wuhan");
              tm.put(new Student("lisi2",22),"shanghai");
 
              Set<Map.Entry<Student,String>>entrySet = tm.entrySet();
              Iterator<Map.Entry<Student,String>>it = entrySet.iterator();
              while(it.hasNext())
              {
                     Map.Entry<Student,String>me = it.next();
                     Student stu = me.getKey();
                     String addr = me.getValue();
 
                     System.out.println(stu+"....."+addr);
              }
       }
}


练习:

"sdfgzxcvasdfxcvdf"获取该字符串中的字母出现的次数。

希望打印结果:a(1)b(2)...

通过结果发现,么一个字母都有对应的次数,说明字母和次数之间都有映射关系。

注意了,当发现有映射关系时,可以选择map集合,因为map集合中存放的就是映射关系。

什么时候时候map集合呢?

当数据之间存在着映射关系时,就要想到map集合。

思路:

1.将字符串转换成字符数组,因为要对每一个字母进行操作。

2.定义一个map集合,因为打印结果的字母有顺序,所以使用TreeMap集合。

3.遍历字符数组

       将么一个字母作为键去查map集合。

       如果返回null,将该字母和1存入到map集合中。

       如果返回不是null,说明该字母在map集合中已经存在并有对应次数,

       那么就获取该次数并进行自增,然后将该字母和自增后的次数存入到map集合中,覆盖调用原来键所对应的值。

4.将map集合中的数据变成制定的字符串形式返回。

import java.util.*;
class MapTest3
{
       public static void main(String[] args)
       {
              String s = charArray("aabcdddefg");
              System.out.println(s);
       }
       public static String charArray(String str)
       {
              char[] chs = str.toCharArray();
 
              TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();//由于泛型里接收的都是引用数据类型,因此这里面接收的只能是Character和Integer
              int count = 0;
              for(int x=0; x<chs.length; x++)
              {
                     if(!(chs[x]>='a'&& chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))
                            continue;
                     Integer value = tm.get(chs[x]);
                     if(value!=null)
                            count = value;
                     count++;
                     tm.put(chs[x],count);
                     count=0;
                     /*
                     if(value==null)
                     {
                            tm.put(chs[x],1);
                     }
                     else
                     {
                            value = value+1;
                            tm.put(chs[x],value);
                     }
                     */
              }
              //System.out.println(tm);
              StringBuilder sb = new StringBuilder();
              Set<Map.Entry<Character,Integer>>entrySet = tm.entrySet();
              Iterator<Map.Entry<Character,Integer>>it = entrySet.iterator();
              while(it.hasNext())
              {
                     Map.Entry<Character,Integer>me = it.next();
                     Character ch = me.getKey();
                     Integer value = me.getValue();
                     sb.append(ch+"("+value+")");
              }
              return sb.toString();//由于sb是StringBuilder类型,因此就要转换成String类型
       }
}

小结:通过查阅API发现,Character自身就实现了Comparable接口,因此输出的语句就是按自然顺序排序的。

 

6、Map扩展

map扩展知识,map集合被使用是因为具备映射关系

一个学校有多个教室,每个教室都有名称

import java.util.*;
class Student
{
       private String id;
       private String name;
       Student(String id,String name)
       {
              this.id = id;
              this.name = name;
       }
       public String toString()
       {
              return id+"::"+name;
       }
}
class MapDemo3
{
       //通过List集合封装Student对象进行遍历
       public static void demo()
       {
              HashMap<String,List<Student>>czbk = new HashMap<String,List<Student>>();
 
              List<Student> yure = new ArrayList<Student>();
              List<Student> jiuye = new ArrayList<Student>();
 
              czbk.put("yureban",yure);
              czbk.put("jiuyeban",jiuye);
 
              yure.add(new Student("01","zhangsan"));
              yure.add(new Student("02","lisi"));
              jiuye.add(new Student("03","wangwu"));
              jiuye.add(new Student("04","zhaoliu"));
 
              Iterator<String> it =czbk.keySet().iterator();
 
              while(it.hasNext())
              {
                     String roomName = it.next();
                     List<Student> room = czbk.get(roomName);
                     System.out.println(roomName);
                     getInfos(room);
              }
 
       }
       public static void getInfos(List<Student> list)
       {
              Iterator<Student> it =list.iterator();
              while(it.hasNext())
              {
                     Students = it.next();
                     System.out.println(s);
              }
       }
       public static void main(String[] args)
       {
              demo();
              /*
              HashMap<String,HashMap<String,String>>czbk = new HashMap<String,HashMap<String,String>>();
              HashMap<String,String> yure = newHashMap<String,String>();
              HashMap<String,String> jiuye = newHashMap<String,String>();
 
              czbk.put("yureban",yure);
              czbk.put("jiuyeban",jiuye);
 
              yure.put("01","zhangsan");
              yure.put("02","lisi");
 
              jiuye.put("03","wangwu");
              jiuye.put("04","zhaoliu");
 
              //遍历czbk集合,获取所有的教室
              Iterator<String> it =czbk.keySet().iterator();
              while(it.hasNext())
              {
                     StringroomName = it.next();
                     HashMap<String,String> room = czbk.get(roomName);
 
                     System.out.println(roomName);
                     getStudentInfo(room);
              }
              */
       }
       public static void getStudentInfo(HashMap<String,String> roomMap)
       {
              Iterator<String> it =roomMap.keySet().iterator();
              while(it.hasNext())
              {
                     String id = it.next();
                     String name = roomMap.get(id);
                     System.out.println(id+":"+name);
              }
       }
      
}

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值