• day20_比较器&Map


    • Comparator比较器
    • Comparable接口
    • Map集合

    Comparable接口

    ​ 调用Collections.sort()方法的类必须实现 Comparable接口,我们可以通过重写compareTo方法来实现功能

    Comparator接口比较器

    Collections工具集中的sort()
    public static <T> void sort(List<T> list)//实现了Comparable接口
    public static <T> void sort(List<T> list,Comparator<? super T> c)//实现Comparator,可以自定义排序规则
    

    ​ Comparator接口在java.util包下,排序是Comparator接口需要实现的功能之一,该接口代表的是一个比较器,比较器具有可比性,可以做排序的。本质其实比较两个对象谁排在前边、谁排在后面。比较的方法是:

    public int compare(Object o1,Object o2):比较两个参数的顺序
        两个对象比较的结果有三种:大于、等于、小于
        如果按照升序排序:则o1<o2(返回负数)、相等返0、o1>o2(返回正数)
        按照降序排序:	则o1<o2(返回正数)、相等返0、o1>o2(返回负数)
        简化:
        	升序:o1-o2
        	降序:o2-o1
    
    public static void main(String []args){
        ArrayList<String > list = new ArrayList();
        list.add("abc");
        list.add("cbd");
        list.add("sba");
        list.add("nba");
        //排序规则,按照字符串第一个字母降序排序     需要自定义规则
        //public static <T> void sort(List<T> list,Comparator<? super T> c)
        Collections.sort(list,new Comparator(){//接口的匿名实现类
            @Override
            public int compare(String o1,String o2){
                /*if(o2.charAt(0) - o1.charAt(0)){
                	return 1;
            	}else if(o2.charAt(0) == o1.charAt(0)){
            		return 0;
            	}else{
            		return -1;
            	}*/
                return o2.charAt(0) - o1.charAt(0);
            }
        });
        System.out.println(list);//[sba,nba,cbd,abc]
    }
    

    简述Comparable和Comparator接口的区别

    • ​ Comparable:强行对实现它的每个类对象进行整体排序。称为类的自然排序。该类的compareTo方法被称之为它的自然比较方法,只能在类中实现compareTo方法一次。不能经常二次修改类的代码实现自己想要的排序。实现此接口的对象列表(或数组)可以通过Collections.sort() 和Arrays.sort() 进行自动排序,对象可以用作有序映射中的键或有序集合中的元素,无需指定 Comparator 比较器
    • ​ Comparator:强行对某个对象进行整体排序,可以将Comparator传递给sort() 方法(如Collections.sort() 和Arrays.sort() )从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(有序的Set或者有序的映射)的顺序,或者为那些没有自然顺序的对象集合提高排序
    • ​ Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。comparable是需要比较的对象来实现接口。这样对象调用实现的方法来比较。对对象的耦合度高(需要改变对象的内部结构,破坏性大)。Comparator相当于一通用的比较工具类接口。需要定制一个比较类去实现它,重写里面的compare方法,方法的参数即是需要比较的对象。对象不用做任何改变。解耦。
    public class Student{
        private String name;
        private int age;
        //JavaBean所需全部结构...
    }
    public class MainClass{
        public static void main(String []args){
    		//假如学生都是歪果仁
            ArrayList<Student> list = new ArrayList();
            list.add(new Student("Tom",20));
            list.add(new Student("Lily",29));
            list.add(new Student("Bob",28));
            list.add(new Student("Jack",24));
            list.add(new Student("Smith",24));
            //按照年龄升序排序
            //如果年龄相同的话,按照姓名首字母降序排序
            Collections.sort(list,new Comparator<Student>(){
                @Override
            	public int compare(Student o1,Student o2){ //嵌套排序
                	int oj = o1.getAge() - o2.getAge()
                    if(oj == 0){
                        oj = o2.getName.charAt(0) - o1.getName.charAt(0);
                    }    
                    return oj;
            	}
            });
            System.out.println(list);//[ 按年龄(姓名首字母)排序 ]
        }
    }
    

    Map集合

    ​ Map中key于value是一一对应的映射关系,Java当中提供专门的集合类用来存放这种映射关系java.util.Map接口

    ​ 特点:

    1. ​ 键唯一
    2. ​ 键和值是一一映射的,一个键对应一个值
    3. ​ 靠键维护他们的关系
    4. ​ 值可以不唯一
    5. ​ key键可以没有,value也可以没有,key和value同时都没有(null)
    6. ​ key只能存储一次null值
    • Collection中的集合,元素是孤立存在的,向集合中存储元素采用一个一个元素存储的方式进行存储。
    • Map中的集合,元素是成对存在的,每个元素由键和值两部分组成,通过键可以找到对应的值
    • Collection中的集合,一般称之为单列集合;Map中的集合,称之为双列集合
    • 注意:Map中的集合不能包含重复的键,值可以重复,每个键对应唯一一个值

    键对值 一对一

    值对键 一对多

    Map中的常用子类

    ​ 子类很多,重点介绍HashMap、LinkedHashMap、HashTable集合

    ​ HashMap:存储数据采用哈希表结构,元素的存取顺序可能不一致,由于要保证键的唯一性,不重复,需要重写键的hashCode方法和equals方法

    ​ LinkedHashMap:HashMap下的一个子类,存储数据的方式也是采用哈希表 + 链表结构,可以通过链表结构保证元素的存取顺序一致 ;通过哈希表结构保证键的唯一不重复

    备注:Map接口中,有两个泛型变量,在使用时,要为两个泛型变量赋予数据类型,两个泛型变量的数据类型可以相同,也可以不同

    Map接口当中的常用方法:

    • ​ public V put(K key,V value):把指定的键与指定的值添加到Map集合当中
    • ​ public V remove(Object key):把指定的键所对应的键值对元素从Map中删除,返回的是被删除元素的值
    • ​ public V get(Object key):根据指定的键 获得在Map集合当中对应的值
    • ​ public Set keySet():获取Map集合当中所有的key值,存储到Set集合中
    • ​ public Set<Map.Entry<K,V>> entrySet():获取Map集合中所有的键值对对象放入Set集合

    Map中的Entry

    ​ 在Map接口中有一个内部接口Entry

    作用:当Map接口集合创建时,紧接着就会在Map集合中创建一个Entry(键值对对象)对象,用来记录Map中的键值对

  • 相关阅读:
    cefsharp wpf 中文输入问题解决方法
    [Node.js]操作mysql
    [Node.js]操作redis
    关系型数据库同步
    微服务和事件驱动
    如何使用REDIS进行微服务间通讯
    CENTOS7开启SSH服务
    WINDOWS和LINUX相互传文件WINSCP
    WINDOWS远程控制LINUX终端XSHELL
    腾讯云CENTOS7安装MSSQL2017
  • 原文地址:https://www.cnblogs.com/mitoris/p/14088128.html
Copyright © 2020-2023  润新知