Pertanyaan Bagaimana mengurutkan objek Array menggunakan antarmuka Komparator kustom di Java 8?


Implementasi Custom Comparator

@FunctionalInterface
public interface Comparator<T>  {

int compare(T t1, T t2);

static <T> Comparator<T> comparing(
        Function<T, Comparable> f){
    return (p1, p2) -> f.apply(p1).compareTo(f.apply(p2));
}

default Comparator<T> thenComparing(
        Comparator<T> cmp){
            return (p1, p2) ->
                    this.compare(p1, p2) == 0 ?
                            cmp.compare(p1, p2) : this.compare(p1, p2);
}

default Comparator<T> thenComparing(
        Function<T, Comparable> f){
            Comparator<T> cmp = comparing(f);
    return thenComparing(cmp);
  }
}

Saya telah membuat kelas Person dengan tiga bidang, yaitu firstName, lastName dan usia, serta pengambil dan penyetel masing-masing. Menggunakan kelas Komparator kustom saya ingin mengurutkan array orang di utama sebagai di bawah:

    Comparator<Person> cmp = Comparator
            .comparing(Person::getLastName) // Extract Property and compare
            .thenComparing(Person::getFirstName)
            .thenComparing(Person::getAge);

     Person arr[] = new Person[]{
        new Person("Sean", "Gilmore", 22),
                new Person("Aaron", "Reidy", 21),
                new Person("Jane", "Kennedy", 53),
                new Person("Mike", "English", 49)
    };


    Arrays.sort(arr, cmp);

Namun Arrays.sort(arr, cmp); melempar kesalahan kompilasi no instance of type variable T exists so that Comparator<Person> conforms to Comparator<? super T>

Saya terlempar oleh kesalahan ini dan saya ingin tahu bagaimana mengurutkan array Person menggunakan cmp Pembanding.


4
2018-02-13 15:55


asal


Jawaban:


Anda dapat dengan mudah menyesuaikannya Comparator ke JDK seperti ini:

Arrays.sort(arr, cmp::compare);

Saya percaya Guava merekomendasikan pola yang sama untuk menyesuaikan antarmuka fungsional mereka sebelum mereka dipasang untuk Java 8.


3
2018-02-13 18:23



Nama yang memenuhi syarat dari a class di Jawa termasuk nama paketnya.

Itu Arrays.sort metode mengharapkan a java.util.Comparator pelaksanaan. Kebiasaan Anda Comparator tidak sama java.util.Comparator.

Itu sort metode dalam Arrays kelas adalah a static metode sehingga Anda tidak dapat memperpanjang Arrays dan mengganti metode ini. Jika ingin digunakan Arrays.sort, gunakan implementasi dari java.util.Comparator. Tidak ada jalan lain.


3
2018-02-13 16:18