Comparator比较器和Comparable接口

本章内容

  • Comparator比较器

  • Comparable接口

学习目标

  • 能够描述Comparable接口和Comparator接口的区别
  • 会自定义Comparable接口和Comparator接口比较器中的比较规则
  • 能够说出Map集合的特点
  • 使用Map集合添加方法保存数据
  • 使用键找值,键值对的方法遍历Map集合
  • 能够使用HsahMap存储自定义键值对的数据
  • 能够使用HashMap编写一些小型案例

Comparator接口比较器

Collections工作集中的sort()
    public static <T> void sort(List<T> list)
    public static <T> void sort(List<T> list,Comparator<? super T> c)

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

public int Compare(Object obj1,Object obj2)  比较两个参数的顺序
    两个对象比较的结果有三种:大于 、等于 、小于
    如果要按照升序排列:则obj1小于obj2返回(负数),相等返回0,obj1大于obj2返回(正数)
     如果要按照降序排列:则obj1小于obj2返回(正数),相等返回0,obj1大于obj2返回(负数)
    简化操作:升序:obj1-obj2
             降序:obj2-obj1
    
public static void main(String []args){
    
    //排序规则,按照首字母降序排序
    ArrayList<String> list=new ArrayList<>();
    list.add("abc");
    list.add("cba");
    list.add("bca");
    list.add("sha");
    Collections.sort(list,new Comparator(){
        @Override
        public int compare(String obj1,String obj2){
            return obj2.charAt(0)-obj1.charAt(0);
        }
        
    });
    
Syste.out.println(list);
}
//[sha,cba,bca,abc]

简述Comparable和Comparator两个接口的区别

Comparable:强行对实现它的每个类对象进行整体排序,这种排序我们一般把它称之为自然排序,类的compartorTo方法称之为它的自然比较方法,只能在类中实现一次,不能经常修改类的代码实现自己想要的排序,实现此接口的对象列表和数组可以通过Collections.sort方法和Arrays.sort方法进行自动排序,对象可以作为有序映射中的键或者有序集合当中的元素,无需指定比较器。

Comparator强行对某个对象进行整体排序,可以将Comparator传递给sort方法,如Collections.sort方法或者是Arrays.sort方法从而允许在排序顺序上实现精确控制,还可以使用Comparator来控制某些数据结构,比如说有序的set或者是有序的映射,或者为那些没有自然顺序的对象Collection提供排序

public class Student{
    
    private String name;
    private int age;
    //getter setter
    //无参,全参
    //toString
    
}
public class MainClass{
    public static void mian(String []args){
        
        ArrayList<Student> list=new ArrayList<>();
            list.add(new Student("tom"20));
            list.add(new Student("lily"21));
            list.add(new Student("rose"18));
            list.add(new Student("jack"99));
            list.add(new Student("smith"99))//按照年龄升序排序
                //如果年龄相同,按照姓名首字母降序排序
                Collections.sort(list,Comparator(){
                    
                    @Override
                    public int compare(Student o1,Student o2){
                        int num=o1.getAge()-o2.getAge();
                        if(num==0){
                            num=02.getName().charAt(0)-01.getName().charAt(0);
                        }
                        return num;
                    }
                });
        System.out.println(list);
    } 
}
//[Student("rose",18),Student("tom",20),Student("lily",21),Student("jack",99)]
//[Student("rose",18),Student("tom",20),Student("lily",21),Student("smith",99),Student("jack",99)]

Map集合

概述:现实生活中,我们常会看到这样一种集合 IP地址和主机名,身份证号和个人,系统用户名和系统用户对象。这种关系我么能称之为映射。Java中提供了专门的集合类用来存放这种映射关系的对象。即java.util.Map接口。

Collection接口集合和Map集合存储的方式不一致

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h7UtyEes-1607562441086)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1607051463782.png)]

  • Collection集合中,元素是孤立存在的,向集合中存储元素采用一个一个元素存储的方式进行存储
  • Map集合,元素是一对一对存储的,每一元素由键和值两部分组成,通过键可以找到相应的值
  • Collection中的集合我们称之为单列集合,Map中的集合我们称之位双列集合
  • 注意:Map集合中不能包含重复的键,但是值可以重复,每一个键对应唯一一个值
Map中的常用子类

通过查看API文档发现有很多个子类,我们主要介绍HashMap、LinkedHsahMap、HashTable集合

  • HashMap集合:存储数据采用的是哈希表结构,元素的存取顺序,由于要保证键的唯一性,不重复,需要重写键的HashCode和equals方法
  • LinkedHashMap :HashMap下里面的子类LinkedHashMap 存储数据的方式是哈希表结构和链表结构,通过链表的结构可以保证元素的存取顺序一致,通过哈希表结构可以保证键的唯一不重复

Map接口当中,含有两个泛型变量,在使用时要为两个泛型变量指定数据类型,两个泛型变量的数据类型可以相同也可以不同。

Map接口当中常用的API方法 Map<K,V>

如下:

  • public V put(K key, V value): 把指定的键与指定的值添加到Map集合当中
  • public V remove(Object key): 把指定的键所对应的键值对元素从集合当中删除,返回的是被删除元素的值
  • public V get(Object key) 根据指定的键,获得在Map集合当中对应的值
  • public Set keySet() 获取Map集合当中所有的key值,存储到Set集合当中
  • public Set<Map.Entry<K,V>> entrySet() 获取到Map集合当中的所有键值对对象的集合
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值