Collections集合工具类、Comparable和Comparator比较器

1、Collections

java.util.Collections是一个集合的工具类

1.1、常见功能

  1. public static boolean addAll(Collection<? super T> c, T… elements):往集合中添加一些元素
  2. public static void shuffle(List<?> list):对集合中的元素进行随机排列
  3. public void static <T extends Comparable<? super T>> sort(List list) :升序排列
package com.bdit;

import java.util.ArrayList;
import java.util.Collections;

public class Test8 {
    
    
    public static void main(String[] args) {
    
    
        ArrayList<Integer> list=new ArrayList<>();
//        list.add(10);
//        list.add(20);
//        list.add(30);
//        list.add(40);
        //采用工具类的addAll方法
        Collections.addAll(list,121,23,35,14,56,16);

        //对集合中的元素进行升序排列
        //Collections.sort(list);
        //随机排列
        Collections.shuffle(list);
        for(int n:list){
    
    
            System.out.println(n);
        }

        ArrayList<String> list2=new ArrayList<>();
        list2.add("cba");
        list2.add("abc");
        list2.add("bca");
        list2.add("123");
        list2.add("true");
        //升序
        Collections.sort(list2);
        System.out.println(list2);

    }
}

2、比较器

我们还是先研究sort方法
public static void sort(List list) :将集合中元素按照默认的规则进行排序,那么默认的规则是怎么来的?
简单的来说进行元素的排序,其实就是两个对象之间比较大小,那么在Java中提供了两种比较实现方式,一种是比较死板的采用java.lang.Comparable接口去实现,一种是灵活的可以指定排序规则的java.util.Comparator接口完成。
那么我们采用的public static void sort(List list)这个方法完成的排序,实际上要求了呗排序的类型需要实现Comparable接口完成比较的功能

public final class Integer extends Number implements Comparable<Integer>

Integer类实现了这个接口,并完成了比较规则的定义,但是这样就把这种规则写死了,那比如我们想要降序排列,那么这就需要修改Integer的源代码,这是不可能的,那么这个时候我们可以使用:

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

方法灵活的完成,这个方法里面就涉及到了Comparator这个接口,位于java.util包中,排序是Comparator能实现的功能之一,该接口代表一个比较器,比较器具有可比性,顾名思义就是做排序的,通俗地讲要比较两个对象谁排在前谁排在后,那么比较的方法就是:

  1. public int compare(T o1, T o2):比较两个参数的顺序
  2. 两个对象比较的结果有三种:大于,等于,小于
  3. 如果按照升序排列,则o1小于o2返回负数,相等返回0,o1大于o2返回正数;
  4. 如果按照降序排列,则o1小于o2返回正数,相等返回0,o1大于o2返回负数
package com.bdit;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

/*
Comparator比较器
 */
public class Test9 {
    
    
    public static void main(String[] args) {
    
    
        ArrayList<String> list2=new ArrayList<>();
        list2.add("cba");
        list2.add("abc");
        list2.add("bca");
        list2.add("123");
        list2.add("true");
        Collections.sort(list2, new Comparator<String>() {
    
    
            @Override
            public int compare(String o1, String o2) {
    
    
                //升序排列
//                if(o1.charAt(0)<o2.charAt(0)){
    
    
//                    return -1;
//                }else if(o1.charAt(0)==o2.charAt(0)){
    
    
//                    return 0;
//                }else{
    
    
//                    return 1;
//                }
                //降序排列
                if(o1.charAt(0)<o2.charAt(0)){
    
    
                    return 1;
                }else if(o1.charAt(0)==o2.charAt(0)){
    
    
                    return 0;
                }else{
    
    
                    return -1;
                }

            }
        });
        System.out.println(list2);
    }
}



package com.bdit;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

/*
对自定义对象进行升序或降序排列
 */
public class Test10 {
    
    
    public static void main(String[] args) {
    
    
        ArrayList<Student> list=new ArrayList<>();
        list.add(new Student(1001,"zhangsan"));
        list.add(new Student(1002,"lisi"));
        list.add(new Student(1003,"wangwu"));
        list.add(new Student(1004,"haha"));
        //根据id降序
        //Collections.sort(list,new MyComparator1());
        //根据name升序
        Collections.sort(list,new MyComparator2());
        for(Student stu:list){
    
    
            System.out.println(stu);
        }
    }
}

//根据id降序排列的比较器
class MyComparator1 implements Comparator<Student>{
    
    

    @Override
    public int compare(Student o1, Student o2) {
    
    
        if(o1.getId()<o2.getId()){
    
    
            return 1;
        }else if(o1.getId()==o2.getId()){
    
    
            return 0;
        }else{
    
    
            return -1;
        }
    }
}
//根据name 进行升序排列
class MyComparator2 implements Comparator<Student>{
    
    

    @Override
    public int compare(Student o1, Student o2) {
    
    
        if(o1.getName().charAt(0)<o2.getName().charAt(0)){
    
    
            return -1;
        }else if(o1.getName().charAt(0)==o2.getName().charAt(0)){
    
    
            return 0;
        }else{
    
    
            return 1;
        }
    }
}

Comparable和Comparator接口的区别

Comparable:强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。只能在类中实现compareTo方法一次,不能经常修改类的代码实现自己想要的排序。实现此接口的对象可以通过Collection.sort()方法进行自动排序。

Comparator强行对某个对象进行整体排序,可以将Comparator传递给sort方法,从而允许在排序顺序上实现自定义控制。

猜你喜欢

转载自blog.csdn.net/vlucky_long/article/details/108588886