欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java語(yǔ)言的Comparable和Comparator區(qū)別

 更新時(shí)間:2023年06月19日 10:51:33   作者:葉晨爍  
這篇文章主要介紹了Java語(yǔ)言的Comparable和Comparator區(qū)別,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

Java的Comparable和Comparator

當(dāng)我們使用自定義 Java 對(duì)象執(zhí)行比較時(shí),我們可以使用ComparableComparator接口。

1.Java可比對(duì)象

Comparable接口對(duì)實(shí)現(xiàn)它的每個(gè)類的對(duì)象強(qiáng)加了總體排序。 此排序稱為類的自然排序。 該類的compareTo()方法必須實(shí)現(xiàn)以提供自然的比較。

2.Java比較器

Comparator接口對(duì)某些對(duì)象集合強(qiáng)加了整體排序。 可以將比較器傳遞給排序方法(例如Collections.sort()Arrays.sort()),以實(shí)現(xiàn)對(duì)排序順序的精確控制。 比較器還可以用于控制某些數(shù)據(jù)結(jié)構(gòu)(例如排序集或排序映射)的順序,或?yàn)闆]有自然順序的對(duì)象集合提供排序。

3.可比對(duì)象和比較器

  • Java可比對(duì)象

    • 必須定義o1.compareTo(o2)
    • 用于實(shí)現(xiàn)對(duì)象的自然排序
    • 我們必須修改要對(duì)其實(shí)例進(jìn)行排序的類
    • 在同一班
    • 只有一種實(shí)現(xiàn)
    • 在 API 中經(jīng)常通過以下方式實(shí)現(xiàn):字符串,包裝類,日期,日歷
  • Java比較器

    • 必須定義compare(o1, o2)
    • 比較類型的兩個(gè)實(shí)例的多種方法-例如 按年齡,姓名比較人
    • 我們可以為我們無(wú)法控制的類提供比較器
    • 我們可以有多個(gè)比較器的實(shí)現(xiàn)
    • 旨在實(shí)現(xiàn)對(duì)第三方類實(shí)例的排序

4.Java內(nèi)置比較器示例

public class JavaBuiltInComparator {
    public static void main(String[] args) {
        List<String> words = new ArrayList<>();
        words.add("dog");
        words.add("pen");
        words.add("sky");
        words.add("rock");
        words.add("den");
        words.add("fountain");
        words.sort(Comparator.naturalOrder());
        words.forEach(System.out::println);
        words.sort(Comparator.reverseOrder());
        words.forEach(System.out::println);
    }
}

Comparator.naturalOrder()返回內(nèi)置的自然順序Comparator。

words.sort(Comparator.naturalOrder());

Comparator.reverseOrder()返回一個(gè)比較器,該比較器強(qiáng)加自然順序。

words.sort(Comparator.reverseOrder());

Comparator.comparingInt()方法從提供的類型中提取 int 排序鍵,并通過該鍵進(jìn)行比較。

class Person {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(int age) {
        this.age = age;
    };
    public int getAge() {
        return this.age;
    }
    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("Person{");
        sb.append("name='").append(name).append('\'');
        sb.append(", age=").append(age);
        sb.append('}');
        return sb.toString();
    }
}
public class JavaBuiltInComparator2 {
    public static void main(String[] args) {
        Person p1 = new Person("Robert", 23);
        Person p2 = new Person("Monika", 18);
        Person p3 = new Person("Tom", 37);
        Person p4 = new Person("Elisabeth", 31);
        List<Person> vals = Arrays.asList( p1, p2, p3, p4 );
        vals.sort(Comparator.comparingInt(Person::getAge));
        vals.forEach(System.out::println);
    }
}

5.多個(gè)比較器

通過Comparator.thenComparing()方法,我們可以在對(duì)對(duì)象進(jìn)行排序時(shí)使用多個(gè)比較器。

class Person {
    private String name;
    private int age;
    private String city;
    public Person(String name, int age, String city) {
        this.name = name;
        this.age = age;
        this.city = city;
    }
    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;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("Person{");
        sb.append("name='").append(name).append('\'');
        sb.append(", age=").append(age);
        sb.append(", city='").append(city).append('\'');
        sb.append('}');
        return sb.toString();
    }
}
public class JavaMultipleComparatorsEx {
    public static void main(String[] args) {
        List<Person> persons = Arrays.asList(
                new Person("Peter", 23, "New York"),
                new Person("Sarah", 13, "Las Vegas"),
                new Person("Lucy", 33, "Toronto"),
                new Person("Sarah", 21, "New York"),
                new Person("Tom", 18, "Toronto"),
                new Person("Robert", 23, "San Diego"),
                new Person("Lucy", 23, "Los Angeles"),
                new Person("Sam", 36, "Dallas"),
                new Person("Elisabeth", 31, "New York"),
                new Person("Ruth", 29, "New York"),
                new Person("Sarah", 41, "New York")
        );
        persons.sort(Comparator.comparing(Person::getName)
                .thenComparing(Person::getCity)
                .thenComparing(Person::getAge));
        persons.forEach(System.out::println);
    }
}

先按對(duì)象名稱比較對(duì)象,然后按城市比較對(duì)象,最后按年齡比較對(duì)象。

persons.sort(Comparator.comparing(Person::getName)
        .thenComparing(Person::getCity)
        .thenComparing(Person::getAge));

6.Java自定義比較器

public class JavaCustomComparatorEx {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("pen", "blue", "atom", "to",
                "ecclesiastical", "abbey", "car", "ten", "desk", "slim",
                "journey", "forest", "landscape", "achievement", "Antarctica");
        words.sort((e1, e2) -> e1.length() - e2.length());
        words.forEach(System.out::println);
        words.sort((e1, e2) ->  e2.length() - e1.length() );
        words.forEach(System.out::println);
    }
}

有一個(gè)單詞表。 根據(jù)單詞的長(zhǎng)度對(duì)其進(jìn)行比較。

words.sort((e1, e2) -> e1.length() - e2.length());

這個(gè)自定義比較器用于按單詞的大小按升序?qū)卧~進(jìn)行排序。

words.sort((e1, e2) ->  e2.length() - e1.length() );

到此這篇關(guān)于Java語(yǔ)言的Comparable和Comparator區(qū)別的文章就介紹到這了,更多相關(guān)JavaComparable和Comparator區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論