进阶08 Collections实现类、Comparator比较器接口

Collections

在这里插入图片描述

常用功能

  • java.utils.Collections是集合工具类,用来对集合进行操作。部分方法如下:
public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。
public static void shuffle(List<?> list) 打乱顺序:打乱集合顺序。

方法1、2

public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<>();
    //往集合中添加多个元素
    /*list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    list.add("e");*/ //如果之后像其中添加很多元素就需要很多add

    //public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。
    Collections.addAll(list,"a","b","c","d","e");

    System.out.println(list);//[a, b, c, d, e]

    //public static void shuffle(List<?> list) 打乱顺序:打乱集合顺序。
    Collections.shuffle(list);
    System.out.println(list);//[b, d, c, a, e], [b, d, c, a, e]
}

小结:addAll是静态方法可以直接使用,list是集合,然后后面是元素

Comparator比较器

方法3

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

注意:
     sort(List<T> list)使用前提
     被排序的集合里边存储的元素,必须实现Comparable,重写接口中的方法compareTo定义排序的规则

Comparable接口的排序规则:
    自己(this)-参数:升序
public static void main(String[] args) {
    ArrayList<Integer> list01 = new ArrayList<>();
    list01.add(1);
    list01.add(3);
    list01.add(2);
    System.out.println(list01);//[1, 3, 2]

    ArrayList类是有序类,输入什么样,输出什么样。


    //public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。
    Collections.sort(list01);//默认是升序
    //sort是静态方法可以直接调用
    System.out.println(list01);//[1, 2, 3]

    ArrayList<String> list02 = new ArrayList<>();
    list02.add("a");
    list02.add("c");
    list02.add("b");
    System.out.println(list02);//[a, c, b]

    Collections.sort(list02);
    System.out.println(list02);//[a, b, c]

    上面的Integer和String类都是有一个Comparable接口,
            重写接口中的方法compareTo定义排序的规则.
    我们重新定义Person类,如果不重写会在编译时报错
    ArrayList<Person> list03 = new ArrayList<>();
    list03.add(new Person("张三",18));
    list03.add(new Person("李四",20));
    list03.add(new Person("王五",15));
    System.out.println(list03);//[Person{name='张三', age=18}, Person{name='李四', age=20}, Person{name='王五', age=15}]

    Collections.sort(list03);
    System.out.println(list03);
}
自定义的Person类:
        //重写排序的规则
    @Override
    public int compareTo(Person o) {
        //return 0;//默认返回0,认为元素都是相同的
        //自定义比较的规则,比较两个人的年龄(this,参数Person)
        //return this.getAge() - o.getAge();//年龄升序排序
        return o.getAge() - this.getAge();//年龄降序排序
    }
}
@Override
public String toString() {
    return "Person{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
}//没有用到set类型的类,不用重写hashset和equals

方法4

  • java.utils.Collections是集合工具类,用来对集合进行操作。部分方法如下:

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

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

 Comparator和Comparable的区别
    Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,
            重写比较的规则compareTo方法
    Comparator:相当于找一个第三方的裁判,比较两个

Comparator的排序规则:
    o1-o2:升序

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

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

public static void main(String[] args) {
    ArrayList<Integer> list01 = new ArrayList<>();
    list01.add(1);
    list01.add(3);
    list01.add(2);
    System.out.println(list01);//[1, 3, 2]

    Collections.sort(list01, new Comparator<Integer>() {
        //重写比较的规则
        @Override
        public int compare(Integer o1, Integer o2) {
            //return o1-o2;//升序
            return o2-o1;//降序
        }
    });

    System.out.println(list01);

    ArrayList<Student> list02 = new ArrayList<>();
    list02.add(new Student("a迪丽热巴",18));
    list02.add(new Student("古力娜扎",20));
    list02.add(new Student("杨幂",17));
    list02.add(new Student("b杨幂",18));
    System.out.println(list02);

    Collections.sort(list02, new Comparator<Student>() {
        @Override
        public int compare(Student o1, Student o2) {
            //按照年龄升序排序
            return o1.getAge()-o2.getAge();
        }
    });

    //扩展:了解
    Collections.sort(list02, new Comparator<Student>() {
        @Override
        public int compare(Student o1, Student o2) {
            //按照年龄升序排序
            int result =  o1.getAge()-o2.getAge();
            //如果两个人年龄相同,再使用姓名的第一个字比较
            if(result==0){
                result =  o1.getName().charAt(0)-o2.getName().charAt(0);
            }
            return  result;
        }

    });

    System.out.println(list02);
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值