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
Barbara Streisandasal
2025-01-04 15:15:39880semak imbas

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;
    }
    ...
}

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;
}
...

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!

Kenyataan:
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