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]

 

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