Java_Collections工具类 Comparable和Comparator两个接口的区别

一.Collections工具类

1.常用功能

java.util.Collections 是集合工具类,用来对集合进行操作.

  • public static boolean addAll(Collection c, T… elements) :往集合中添加一些元素。

  • public static void shuffle(List<?> list) 打乱顺序 :打乱集合顺序。

  • public static void sort(List list) :将集合中元素按照默认规则排序。

  • public static void sort(List list,Comparator<? super T> ) :将集合中元素按照指定规则排序

public class CollectionsDemo {
    public static void main(String[] args) {
          ArrayList<Integer> list = new ArrayList<Integer>();
        //原来写法
        //list.add(12);
        //list.add(14);
        //list.add(15);
        //list.add(1000);
        //采用工具类 完成 往集合中添加元素
        Collections.addAll(list, 5, 222, 1,2);
        System.out.println(list);//[5, 222, 1, 2]

        //打乱集合顺序
        Collections.shuffle(list);
        System.out.println("打乱顺序之后的集合:"+list);//[1, 222, 2, 5](随机)
    }
}
结果:
[5, 222, 1, 2]
[1, 222, 2, 5]

2.Collections排序的方法

按照默认规则进行排序:

  • public static void sort(List list):将集合中元素按照默认规则排序。

我们使用的是默认的规则对集合中的元素进行排序,那么默认规则是怎么定义出来的呢?

通过要求集合中元素所属的类实现Comparable接口,然后在实现Comparable接口的时候会重写compareTo()方法,在CompareTo()方法中指定默认规则,由于只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序,所以称为默认规则

按照指定规则进行排序:

  • public static void sort(List list,Comparator<? super T> ):将集合中元素按照指定规则排序。

我们使用指定规则对集合中元素进行排序,那么如何指定规则呢?
通过将Comparator 比较器对象传递给sort方法,在Comparator比较器中有一个int compare(T o1, T o2)方法,在compare方法中指定比较规则,从而允许在排序顺序上实现精确控制

    public static void main(String[] args) {
        ArrayList<String>  list = new ArrayList<String>();
        list.add("cba");
        list.add("aba");
        list.add("sba");
        list.add("nba");
        
        //排序方法
        // 按照String类中指定的默认排序规则进行排序
        Collections.sort(list);
        System.out.println(list);//[aba, cba, nba, sba]


        // 指定规则进行排序
        // 按照首字母降序排序
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                // 前减后:升序
                // 后减前: 降序
                return o2.charAt(0) - o1.charAt(0);
            }
        });
        System.out.println(list);//[sba, nba, cba, aba]

    }

二.Comparable和Comparator两个接口的区别

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

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

Student 初始类


public class Student{
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
               "name='" + name + '\'' +
               ", age=" + age +
               '}';
    }
}

测试类:

public class Demo {

    public static void main(String[] args) {
        // 创建四个学生对象 存储到集合中
        ArrayList<Student> list = new ArrayList<Student>();

        list.add(new Student("rose",18));
        list.add(new Student("jack",16));
        list.add(new Student("abc",16));
        list.add(new Student("ace",17));
        list.add(new Student("mark",16));


        /*
          让学生 按照年龄排序 升序
         */
//        Collections.sort(list);//要求 该list中元素类型  必须实现比较器Comparable接口


        for (Student student : list) {
            System.out.println(student);
        }


    }
}

发现,当我们调用Collections.sort()方法的时候 程序报错了。

原因:如果想要集合中的元素完成排序,那么必须要实现比较器Comparable接口。

于是我们就完成了Student类的一个实现,如下:

public class Student implements Comparable<Student>{
    ....
    @Override
    public int compareTo(Student o) {
        return this.age-o.age;//升序
    }
}

结果:

Student{name='jack', age=16}
Student{name='abc', age=16}
Student{name='mark', age=16}
Student{name='ace', age=17}
Student{name='rose', age=18}

扩展
对ArrayList集合中的Student对象按照指定规则进行排序
指定规则:

  • 以学生年龄降序
  • 以学生年龄降序,如果年龄相同,就以姓名的首字母 升序排序
Collections.sort(list, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                // 年龄降序
                int result = o2.getAge()-o1.getAge();//年龄降序

                if(result==0){//姓名的首字母 升序
                    result = o1.getName().charAt(0)-o2.getName().charAt(0);
                }

                return result;
            }
        });

结果:

Student{name='rose', age=18}
Student{name='ace', age=17}
Student{name='abc', age=16}
Student{name='jack', age=16}
Student{name='mark', age=16}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaCollections.sort()方法是用来对List型进行排序的。 它有两种参数形式。第一种是public static <T extends Comparable<? super T>> void sort(List<T> list),这种方法会根据元素的自然顺序进行排序。 第二种是public static <T> void sort(List<T> list, Comparator<? super T> c),这种方法则需要传入一个Comparator比较器来指定排序规则。 使用Comparator的方式有两种:Collections.sort(list,Comparator<T>)和list.sort(Comparator<T>)。 整体来说,Collections.sort()方法是一个非常方便的工具类方法,可以用来对List型进行排序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [JavaCollections.sort()的使用!](https://blog.csdn.net/qq_23179075/article/details/78753136)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Java基础:Collections.sort的两种用法详解](https://blog.csdn.net/weixin_45525272/article/details/125275363)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值