Collections集合工具类、Comparable接口(比较接口)、Comparator接口(比较接口)

Collections集合工具类
常用的静态方法:
public static <T> boolean addAll(Collection<? super T> c, T... elements)//将所有指定元素添加到指定的集合
public static void shuffle(List<?> list) //将List集合中的元素顺序打乱
public static <T extends Comparable<? super T>> void sort(List<T> list)//对 自然排序的元素进行升序排列

package mycollection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Random;

public class TestCollections01 {
    public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList<>();
        Collections.addAll(arrayList,"a","b","c","d","e");
        System.out.println(arrayList);//[a, b, c, d, e]

        Collections.shuffle(arrayList,new Random(1));
        System.out.println(arrayList);//[c, d, b, e, a]
        Collections.sort(arrayList);
        System.out.println(arrayList);//[a, b, c, d, e]


        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list,1,3,2,6,4);
        System.out.println(list);//[1, 3, 2, 6, 4]
        Collections.sort(list);
        System.out.println(list);//[1, 2, 3, 4, 6]
    }
}

注意:

sort(List list)使用的前提

被排序的集合里面存储的元素,必须实现Comparable,重写接口中的CompareTo定义排序的规则

comparable接口的排序规则:(java.lang public interface Comparable这个接口规定了每类实现它的对象进行整体排序,需重写类的compareTo方法)

自己(this)-参数:升序

参数-自己(this):倒序

自定义数据类型存储在集合中,进行sort,该自定义类型必须实现Comparable接口,实现的了compareTo方法

package mycollection;

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

//对集合中的自定义数据类型的排序
public class TestCollectionsSort01 {
    public static void main(String[] args) {
        ArrayList<Man> arrayList = new ArrayList<>();
        Collections.addAll(arrayList,new Man("小明",12),new Man("小华",2),new Man("小张",8));
        System.out.println(arrayList);//[Man{name='小明', age=12}, Man{name='小华', age=2}, Man{name='小张', age=8}]

//        Collections.sort(arrayList);在自定义类Man没有实现Comparable接口时,编译时,会自动报错
        Collections.sort(arrayList);
        System.out.println(arrayList);//[Man{name='小华', age=2}, Man{name='小张', age=8}, Man{name='小明', age=12}]

    }
}
class Man implements Comparable<Man>{
    private String name;
    private int age;

    public Man() {
    }

    public Man(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 "Man{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    //实现了Comparable接口,重写了compareTo方法
    @Override
    public int compareTo(Man o) {
        return this.age - o.age;//按年龄升序排列
    }
}
public static <T> void sort(List<T> list, Comparator<? super T> c)//排序

Comparator和Comparable的 区别

Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写compareTo方法

Comparator:相当于找一个第三方菜品,比较两个

Comparator的排序规则:

o1-o2:升序

o2-o1:降序

package mycollection;

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

public class TestCollectionsSort02 {
    public static void main(String[] args) {
        ArrayList<Woman> arrayList = new ArrayList<>();
        Collections.addAll(arrayList,new Woman("小红",12),new Woman("b小绿",5),new Woman("小黄",6),new Woman("a小蓝",5));
        System.out.println(arrayList);//[Woman{name='小红', age=12}, Woman{name='b小绿', age=5}, Woman{name='小黄', age=6}, Woman{name='a小蓝', age=5}]

        Collections.sort(arrayList,new Comparator<Woman>() {
            @Override
            public int compare(Woman o1, Woman o2) {
                int result = o1.getAge() - o2.getAge();//按年龄升序
                if (result == 0){//如果年龄相同,按名字首字母排序
                    result = o1.getName().charAt(0) - o2.getName().charAt(0);
                }
                return result;
            }
        });
        System.out.println(arrayList);//[Woman{name='a小蓝', age=5}, Woman{name='b小绿', age=5}, Woman{name='小黄', age=6}, Woman{name='小红', age=12}]
    }
}

class Woman{//注意,这儿没有实现Comparable接口,重写compareTo方法
    private String name;
    private int age;

    public Woman() {
    }

    public Woman(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 "Woman{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
posted @ 2020-08-12 10:40  DannyBoy~  阅读(204)  评论(0编辑  收藏  举报