Rumah > Java > javaTutorial > Mengapa Pembanding Java Saya Melemparkan Ralat 'Kaedah Perbandingan Melanggar Kontrak Amnya'?

Mengapa Pembanding Java Saya Melemparkan Ralat 'Kaedah Perbandingan Melanggar Kontrak Amnya'?

Barbara Streisand
Lepaskan: 2025-01-04 15:15:39
asal
868 orang telah melayarinya

Why Does My Java Comparator Throw a

Ralat Java: "Kaedah Perbandingan Melanggar Kontrak Umumnya"

Apabila menyusun koleksi, Java menggunakan kaedah perbandingan untuk mewujudkan susunan objek. Walau bagaimanapun, kaedah ini mesti mematuhi prinsip transitivity, yang menyatakan bahawa jika objek A lebih besar daripada B dan B lebih besar daripada C, maka A mesti lebih besar daripada C. Dalam keadaan tertentu, kontrak ini boleh dilanggar, yang membawa kepada " Kaedah perbandingan melanggar ralat kontrak amnya.

Contoh

Pertimbangkan pembanding tersuai berikut, bertujuan untuk mengisih objek berdasarkan kriteria tertentu. Walau bagaimanapun, disebabkan ketidakkonsistenan logik, ia melanggar peraturan transitiviti:

@Override
public int compareTo(Object o) {
    ...
    if (card1.getRarity() < card2.getRarity()) {
        return 1;
    }
    ...
    if (card1.getSet() > card2.getSet()) {
        return -1;
    }
    ...
}
Salin selepas log masuk

Isu Transitiviti

Dalam contoh di atas, jika card1.getRarity() ialah penentu factor dan card1.getRarity() adalah kurang daripada card2.getRarity(), pembanding mengembalikan dengan betul 1. Walau bagaimanapun, jika card2.getSet() ialah faktor penentu dan card2.getSet() adalah kurang daripada card1.getSet(), pembanding tersilap mengembalikan -1. Ini mengakibatkan situasi bukan transitif.

Penyelesaian Betul

Untuk memastikan transitiviti, pembanding harus mematuhi logik berikut:

if (card1.getRarity() < card2.getRarity()) {
    return 1;
}
if (card1.getRarity() > card2.getRarity()) {
    return -1;
}
...
Salin selepas log masuk

Ringkasnya, untuk mengelakkan ralat "Kaedah perbandingan melanggar kontrak amnya", pastikan kaedah pembanding anda mematuhi prinsip transitiviti. Peraturan ini menetapkan bahawa jika objek A lebih besar daripada B dan B lebih besar daripada C, maka A mesti lebih besar daripada C. Dengan memastikan transitif, anda menjamin tingkah laku pengisihan yang konsisten dan betul.

Atas ialah kandungan terperinci Mengapa Pembanding Java Saya Melemparkan Ralat 'Kaedah Perbandingan Melanggar Kontrak Amnya'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan