Java基础之【Comparable和Comparator】

排序主要分为三种情况

1.【内部排序】使用Comparable通过implements通过implements Comparable<Object>接口override compareTo方法实现

return值  0表示相等 1表示大于 -1表示小于

2.【外部排序】通过Comparator实现

3.以上1 2条针对的都是自定义类,而java对Integer String等已经实现了排序接口Comparable,直接Collections.sort(List)使用即可

public final class Integer extends Number implements Comparable<Integer> {
//.....
}

 

三种情况的示例代码如下:

/**
 * @author huangweiyue
 * @description Comparable 【内部排序】, 通过implements Comparable<Object>接口override compareTo方法实现
 * @date Created in 2019-06-28
 */
public class ComparableTest {
    public static void main(String[] args) {
        List<Person> list=new ArrayList<Person>();
        Person test1=new Person(66,"李四");
        Person test2=new Person(29,"王五");
        Person test3=new Person(28,"赵六");
        Person test4=new Person(20,"钱三");
        list.add(test4);
        list.add(test3);
        list.add(test2);
        list.add(test1);
        Collections.sort(list);
        for(Object s:list){
            System.out.println(s);
        }
    }


}

class Person implements Comparable<Person>{
    public int age;    //年龄
    public String name;  //姓名

    //get、set方法
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Person(int age, String name) {
        super();
        this.age = age;
        this.name = name;
    }
    @Override
    public String toString() {
        return "Person [age=" + age + ", name=" + name + "]";
    }
    //实现Comparable接口必须实现compareTo方法 比较规则自己实现
    @Override
    public int compareTo(Person person) {
        if(this.age==person.getAge()){
            return 0;
        }else if(this.age>person.getAge()){
            return 1;
        }else {
            return -1;
        }
    }
}

输出:

Person [age=20, name=钱三]
Person [age=28, name=赵六]
Person [age=29, name=王五]
Person [age=66, name=李四]

 

 

/**
 * @author huangweiyue
 * @description Comparator方式进行比较 【外部排序】 不需要实现Comparable接口  无法修改实体类时,直接在调用方创建
 * @date Created in 2019-06-28
 */
public class ComparatorTest {
    public static void main(String[] args) {
        List<Emp> list = new ArrayList<>();
        Emp test1 = new Emp(69, "李四");
        Emp test2 = new Emp(29, "王五");
        Emp test3 = new Emp(28, "赵六");
        Emp test4 = new Emp(20, "钱三");
        list.add(test4);
        list.add(test3);
        list.add(test2);
        list.add(test1);
        Collections.sort(list, (o1, o2) -> {
            if (o1.age == o2.age && o1.name == o2.name) {
                return 0;
            } else if (o1.age > o2.age) {
                return 1;
            } else {
                return 0;
            }
        });
        for (Object s : list) {
            System.out.println(s);
        }
    }
}

@Data
@AllArgsConstructor
@NoArgsConstructor
class Emp {
    public int age;
    public String name;
}

输出:

Emp(age=20, name=钱三)
Emp(age=28, name=赵六)
Emp(age=29, name=王五)
Emp(age=69, name=李四)

 

 


/**
 * @author huangweiyue
 * @version v1.0
 * @task
 * @description List<Integer> 排序测试 Integer已经默认实现了排序接口
 * @date Created in 2019-06-28
 * @modifiedBy
 */
public class ListIntegerComparableTest {
    public static void main(String[] args) {
        List<Integer> list=new ArrayList<>();
        list.add(4);
        list.add(55);
        list.add(66);
        list.add(1);
        list.add(0);
        list.add(12);
        list.add(9);
        Collections.sort(list);
        System.out.println(list);

    }
}

输出:

[0, 1, 4, 9, 12, 55, 66]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章