Collections集合工具类,Comparable接口比较器

Collections集合工具类

java.util.Collection 是集合工具类,用来操作集合对象当中的元素,方法如下

1.往集合中一次性添加多个元素。

  • public static <T> boolean addAll(Collection<? super T> c,T... elements)
    

2.打乱集合中的元素顺序

  • public static <T> void shuffle(List<?> list)
    

3.将集合中的元素按照默认规则排序(如果元素为对象,需要重写compareTo()方法)

  • public static <T> void sort(List<T> list)
    

4.将集合中元素,根据指定比较器产生的顺序进行排序

  • public static <T> void sort(List<T> list,Comparator<? super T> c)
    

Comparable接口比较器

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 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("cba");
    list.add("bca");
    list.add("sba");
    list.add("nba");
    //使用接口的方法,
    //public static <T> void sort(List<T> list,Comparator<? super T> c)
    Collections.sort(list,new Comparator(){
        @Overrid
        public int compare(String o1,String o2){
            /*if(o2.charAt(0) - o1.charAt(0) > 0){
                return 1;
            } else if ( o2.charAt(0) - o1.charAt(0) == 0){
                return 0;
            } else {
                return -1;
            }*/
            return o2.charAt(0) - o1.charAt(0);
        }
    });
    System.out.println(list);
}
//[sba,nba,cba,bca,abc]
简述Comparable和Comparator两个接口的区别

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值