美文网首页
Day16--集合

Day16--集合

作者: pure_joy | 来源:发表于2019-07-16 18:28 被阅读0次
    Map
    • Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。
      Map
       | --Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。jdk1.0效率低。
       | --HashMap:底层是哈希表数据结构,允许使用null值和null键,该集合是不同步的。jdk1.2效率高。
       | --TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。
      和Set很像。其实,Set底层就是使用了Map集合。
    • 共性方法:
      1、添加
       put(K key,V value):如果添加时,出现相同的键。那么后添加的值会覆盖原有键对应值。并put方法会返回被覆盖的值。
       putAll(Map<? extends K,? extends V> m);
      2、删除
       clear();
       remove(Object key);
      3、判断
       containsValue(Object object);
       containsKey(Object object);
       isEmpty();
      4、获取
       get(Object key):可以通过get方法的返回值来判断一个键是否存在。通过返回null来判断。
       size();
       values();
       entrySet();
       keySet();
    • map集合的两种取出方式:
      1、Set<k> keySet:将map中所有的键存入到Set集合。因为set具备迭代器。所以可以使用迭代方式取出所有的键,在根据get方法,获取每一个键对应的值。
      2、Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到set集合中,而这个关系的数据类型就是:Map.Entry。
       Map.Entry:其实Entry就是一个接口,它是Map接口中的一个内部接口。
    interface Map
    {
        public static interface Entry
        {
            public abstract Object getKey();
            public abstract Object getValue();
        }
    }
    
    • Map集合取出的原理:将map集合转成set集合,在通过迭代器取出。
    • Map练习
    /*
    每一个学生都有对应的归属地
    学生Student,地址String
    学生属性:姓名,年龄
    注意:姓名和年龄相同的视为同一个学生。
    保证学生的唯一性。
    
    1、描述学生
    
    2、定义map容器,将学生作为键,地址作为值,存入。
    
    3、获取map集合中的元素。
    */
    import java.util.*;
    class 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*34;
        }
    
        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 MapSet
    {
        public static void main(String[] args) {
    
            HashMap<Student,String> hm = new HashMap<Student,String>();
    
            hm.put(new Student("lisi1",21),"beijing");
    
            //第一种取出方式 keySet
            Set<Student> keySet = hm.keySet();
    
            Iterator<Student> it = keySet.iterator();
    
            while(it.hashNext())
            {
                Student stu = it.next();
                String addr = hm.get(stu);
    
                System.out.println(stu+":"+addr);
            }
    
            //第二种取出方式 Entry
            Set<Map.Entry<Student,String>> entrySet = hm.entrySet();
    
            Iterator<Map.Entry<Student,String>> iter = entrySet.iterator();
    
            while(iter.hashNext())
            {
                Map.Entry<Student,String> me = iter.next();
                Student stu = me.getKey();
                String addr = me.getValue();
    
                System.out.println(stu+"..."+addr);
            }
        }
    }
    
    • TreeMap练习
    /*
    需求:对学生对象的年龄进行升序排序。
    
    因为数据是以键值对的形式存在的。
    所以要使用可以排序的Map集合。TreeMap。
    */
    import java.util.*;
    
    class StuNameComparator implements Comarator<Studnet>
    {
        public int compare(Studnet s1,Studnet 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<Studnet,String> tm = new TreeMap<Studnet,String>(new StuNameComparator());
    
            tm.put(new Studnet("lisi3",23),"beijing");
            tm.put(new Studnet("lisi1",21),"nanjing");
            tm.put(new Studnet("lisi4",24),"shanghai");
    
            Set<Map.Entry<Studnet,String>> entrySet = tm.entrySet();
    
            Iterator<Map.Entry<Studnet,String>> it = entrySet.iterator();
    
            while(it.hashNext())
            {
                Map.Entry<Studnet,String> me = it.next();
    
                Studnet stu = me.getKey();
                String addr = me.getValue();
    
                System.out.println(stu+":"+addr);
            }
        }
    }
    
    • TreeMap练习--字母出现次数
    /*
    练习:
    "sdfghjklzxcvbnmmfdss"获取该字符串中字母出现的次数
    
    希望打印结果:a(1)c(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) {
            
            System.out.println(charCount("sadsadadadada"));
        }
    
        public static String charCount(String str)
        {
            char[] chs = str.toCharArray();
    
            TreeMap<Character,Integer> tm = new TreeMap<Character,Iterable>();
    
            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);
                }
                */
            }
    
            StringBuilder sb = new StringBuilder();
    
            Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();
    
            Iterator<Map.Entry<Character,Integer>> it = entrySet.iterator();
    
            while(it.hashNext())
            {
                Map.Entry<Character,Integer> me = it.next();
    
                Character ch = me.getKey();
                Integer value = me.getValue();
    
                sb.append(ch+"("+value+")");
            }
    
            return sb.toString();
        }
    }
    
    • Map扩展
      map集合被使用是因为具备映射关系。

    相关文章

      网友评论

          本文标题:Day16--集合

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