美文网首页
java笔记--Map集合框架

java笔记--Map集合框架

作者: 吃饱喝足搬代码丶 | 来源:发表于2018-10-16 10:55 被阅读0次

    Map:一次添加一对元素。Collection一次添加一个元素。

    Map也称为双列集合,Collection集合称为单列集合。其实map集合中存储的就是键值对。map集合中必须保证键的唯一性。

    常用的方法:

    1,添加。
    value put(key,value):返回前一个和可以关联的值,如果没有返回null。

    2,删除。
    void clear():清空map集合。
    value remove(key):根据指定的key删出这个键值对。

    3,判断。
    boolean containsKey(key)
    boolean containsValue(value)
    boolean isEmpty()

    4,获取。
    value get(key):通过键获取值,如果没有该键返回null。
    当然可以通过返回bull,来判断是否包含指定键。
    int size():获取键值对的个数。

    public class MapDemo {
    
        public static void main(String[] args) {
            
            Map<Integer,String> map=new HashMap<Integer,String>();
            method_2(map);
            method(map);
        }
    
        private static void method(Map<Integer, String> map) {//学好和姓名
    
            //添加元素
            System.out.println(map.put(8, "wangcai"));//输出为null
            System.out.println(map.put(8, "xiaoqiang"));//存相同键,值会覆盖//输出为wangcai
            map.put(2, "value");
            map.put(7, "vhhd");
            
            //删除
            System.out.println("remove:"+map.remove(2));
            
            //判断
            System.out.println("containskey:"+map.containsKey(7));
            
            //获取
            System.out.println("get:"+map.get(6));
            
            System.out.println(map);
            
        }
    
        private static void method_2(Map<Integer, String> map) {
    
            map.put(8,"zhaoliu");
            map.put(2,"zhaoliu");
            map.put(7, "xiaoqiang");
            map.put(6,"wangcai");
            
            Collection<String> values=map.values();
            
            Iterator<String> it2=values.iterator();
            while(it2.hasNext()){
                System.out.println(it2.next());
            }
            /*
            通过Map转成set就可以迭代。
            找到另一种方法。enteySet。。
            该方法将键和值的映射关系作为对象存储到了Set集合中,而这个映射关系的集合就是Map.Entry类型(内部接口、嵌套类)
            */
            Set<Map.Entry<Integer,String>> entrySet=map.entrySet();
            
            Iterator<Map.Entry<Integer, String>> it=entrySet.iterator();
            
            while(it.hasNext()){
                Map.Entry<Integer, String> me=it.next();
                Integer key=me.getKey();
                String value=me.getValue();
                System.out.println(key+": :"+value);
            }
        }
    
    }
    /*
    Map.Entry原理:
    
    interface MyMap{
        public static interface MyEntry{//内部接口
            void get();
        }
    }
    
    class MyDemo implements MyMap.MyEntry{
        public void get(){//重写get方法
            
        }
    }
    
    类似于:
    class Outer{
        static class Inner{
            static void show(){}
        }
    }
    然后在main里被直接调用:
    Outer.Inner.show();
    */
    
    运行:
    Map常用的子类:

    |--Hashtable:内部结构是哈希表,是同步的。不允许null作为键,null作为值。
           |--Properties:用来存储键值对型的配置文件的信息,可以和IO技术相结合。

    |--HashMap:内部结构是哈希表,不是同步的。允许null作为键和值。

    |--TreeMap:内部结构地二叉树,不是同步的。可以对Map集合中的键进行排序。

    HashMapDemo:

    public static void main(String[] args) {
            
            /*
            将学生对象和学生归属地通过键与值存到map集合中
            */
            
            HashMap<Student,String> hm=new HashMap<Student,String>();
            
            hm.put(new Student("lisi",38), "北京");
            hm.put(new Student("zhaoliu",24), "上海");
            hm.put(new Student("xiaoqiang",31), "沈阳");
            hm.put(new Student("wqangcai", 28),"大连");
            hm.put(new Student("zhaoliu",24), "铁岭");//在person中重写覆盖了hashcode和equals去重
            
            /*Set<Student> keySet=hm.keySet();
            Iterator<Student> it=keySet.iterator();可直接合并*/
            
            Iterator<Student> it=hm.keySet().iterator();
            while(it.hasNext()){
                Student key=it.next();
                String value=hm.get(key);
                System.out.println(key.getName()+": "+key.getAge()+"--"+value);
            }
        }
    
    运行:

    TreeMapDemo:

    public static void main(String[] args) {
            
            TreeMap<Student,String> tm=new TreeMap<Student,String>(new ComparatorByName());
    
            tm.put(new Student("lisi",38), "北京");
            tm.put(new Student("zhaoliu",24), "上海");
            tm.put(new Student("xiaoqiang",31), "沈阳");
            tm.put(new Student("wqangcai", 28),"大连");
            tm.put(new Student("zhaoliu",24), "铁岭");
            
            Iterator<Map.Entry<Student, String>> it = tm.entrySet().iterator();
            
            while(it.hasNext()){
                Map.Entry<Student,String> me = it.next();
                Student key = me.getKey();
                String value = me.getValue();
                
                System.out.println(key.getName()+":"+key.getAge()+"---"+value);
            }
        }
    
    运行:

    LinkesHashMap:

    public static void main(String[] args) {
            
            HashMap<Integer,String> hm=new LinkedHashMap<Integer,String>();
            
            hm.put(7, "zhouqi");
            hm.put(3, "zhangsam");
            hm.put(1, "qianyi");
            hm.put(5, "wangwu");
    
            Iterator<Map.Entry<Integer,String>> it=hm.entrySet().iterator();
            
            while(it.hasNext()){
                Map.Entry<Integer, String> me=it.next();
                
                Integer key=me.getKey();
                String value=me.getValue();
                
                System.out.println(key+": "+value);
            }
        }
    
    运行:
    练习:

    “fdgavcbsacdfs“获取该字符串中,每一个字母出现的次数。
    要求打印结果是:a(2)b(1)...;
    思路:
    对于结果的分析发现,字母和次数之间存在着映射关系。而且这种关系很多。
    很多就需要存储,能存储映射关系的容器有数组和Map集合。
    关系一:方式有序编号吗?没!
    那就是使用Map集合。又发现可以保证唯一性的一方具备着a b c...
    所以可以使用TreeMap集合。

    这个集合最终应该存储的是字母和次数的对应关系。

    1,因为操作的是字符串的字母,所以先将字符串变成字符数组。
    2,遍历字符数组,用每一个字母作为键去查Map集合这个表,看看集合中是否有这个元素。
    如果该字母键不存在,就将该字母作为键 1作为值存储到map集合中。
    如果该字母键存在,就将该字母键对应值取出并+1,再将该字母和+1后的值存储到map集合中,
    键相同值会覆盖。这样就记录住了该字母的次数。
    3,遍历结束,map集合就记录所有字母出现次数。

    public class MapTest {
    
        public static void main(String[] args) {
            
            String str="fdgav    +cbsacdfs";
            
            String s=getCharCount(str);
            
            System.out.println(s);
        }
    
        private static String getCharCount(String str) {
            
            //将字符串变成字符数组
            char[] chs=str.toCharArray();
            
            //定义map集合表
            Map<Character,Integer> map=new TreeMap<Character,Integer>();
            
            for(int i=0;i<chs.length;i++){
                /*if(!(chs[i]>='a' && chs[i]<='z' || chs[i]>='A' && chs[i]<='Z'))//只取字母
              //if(!(Character.toLowerCase(chs[i])>='a' && Character.toLowerCase(chs[i])<='z'))
                    continue;*/
                
                //将数组中的字母作为键去查map表
                Integer value=map.get(chs[i]);
                /*
                //判断值是否为null
                if(value==null){
                    map.put(chs[i], 1);
                }else{
                    map.put(chs[i], value+1);
                }
                */
                int count=1;
                if(value!=null){
                    count=value+1;
                }
                map.put(chs[i], count);
            }
    //      return map.toString();
            return mapToString(map);
        }
    
        private static String mapToString(Map<Character, Integer> map) {
            
            StringBuilder sb=new StringBuilder();
            
            Iterator<Character> it=map.keySet().iterator();
            
            while(it.hasNext()){
                Character key=it.next();
                Integer value=map.get(key);
                
                sb.append(key+"("+value+")");
            }
            return sb.toString();
        }
    
    运行:

    Map有映射关系,在查表法中的应用较为多见。,可以有限考虑。

    public static void main(String[] args) {
    
            /*
             * Map在有映射关系时,可以优先考虑。
             * 
             * 在查表法中的应用较为多见。
             */
            
            String week = getWeek(1);
            System.out.println(week);
            
            System.out.println(getWeekByMap(week));
        }
        public static String getWeekByMap(String week){
            
            Map<String,String> map = new HashMap<String,String>();
            
            map.put("星期一","Mon");
            map.put("星期二","Tus");
            map.put("星期三","Wes");
            map.put("星期日","Sun");
            map.put("星期天","Sun");
            
            return map.get(week);
        }
        
        
        public static String getWeek(int week){
            
            if(week<1 || week>7)
                throw new RuntimeException("没有对应的星期,请您重新输入");
            
            String[] weeks = {"","星期一","星期二"};
            
            return weeks[week];
        }
    

    相关文章

      网友评论

          本文标题:java笔记--Map集合框架

          本文链接:https://www.haomeiwen.com/subject/ofugaftx.html