Saya belajar cara menggunakan yang sebanding tetapi saya mengalami kesulitan dengan Pembanding. Saya mengalami kesalahan dalam kode saya:
Exception in thread "main" java.lang.ClassCastException: New.People cannot be cast to java.lang.Comparable
at java.util.Arrays.mergeSort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
at New.TestPeople.main(TestPeople.java:18)
Ini kode saya:
import java.util.Comparator;
public class People implements Comparator {
private int id;
private String info;
private double price;
public People(int newid, String newinfo, double newprice) {
setid(newid);
setinfo(newinfo);
setprice(newprice);
}
public int getid() {
return id;
}
public void setid(int id) {
this.id = id;
}
public String getinfo() {
return info;
}
public void setinfo(String info) {
this.info = info;
}
public double getprice() {
return price;
}
public void setprice(double price) {
this.price = price;
}
public int compare(Object obj1, Object obj2) {
Integer p1 = ((People) obj1).getid();
Integer p2 = ((People) obj2).getid();
if (p1 > p2) {
return 1;
} else if (p1 < p2){
return -1;
} else {
return 0;
}
}
}
import java.util.ArrayList;
import java.util.Collections;
public class TestPeople {
public static void main(String[] args) {
ArrayList peps = new ArrayList();
peps.add(new People(123, "M", 14.25));
peps.add(new People(234, "M", 6.21));
peps.add(new People(362, "F", 9.23));
peps.add(new People(111, "M", 65.99));
peps.add(new People(535, "F", 9.23));
Collections.sort(peps);
for (int i = 0; i < peps.size(); i++){
System.out.println(peps.get(i));
}
}
}
Saya percaya itu harus melakukan sesuatu dengan casting dalam metode bandingkan tetapi saya bermain-main dengan itu dan masih tidak dapat menemukan solusinya
java
sorting
comparator
Dan
sumber
sumber
Comparator<People>
,Comparable<People>
,List<People>
, dllsort
. Jika Anda disuruh menggunakanComparator<People>
, maka gunakan argumen 2sort
, bukan argumen 1sort
(yang mengharuskanPeople implements Comparable<People>
).Jawaban:
Ada beberapa hal yang aneh dengan kelas contoh Anda:
price
daninfo
(lebih banyak sesuatu untuk objek, bukan orang);Bagaimanapun, ini adalah demo cara menggunakan
Comparator<T>
:EDIT
Dan demo Java 8 yang setara akan terlihat seperti ini:
sumber
a.age - b.age
int
stackoverflow.com/questions/2728793/…Comparable
, Anda harus memilih satu atribut untuk dibandingkan. Dalam hal seseorang, ada banyak atribut yang dapat dibandingkan: umur, panjang, jenis kelamin, nama, dll. Dalam hal ini, mudah untuk menyediakan beberapa pembanding yang melakukan perbandingan ini.Berikut ini adalah templat super pendek untuk segera disortir:
jika sulit untuk diingat, cobalah untuk hanya mengingat bahwa itu mirip (dalam hal tanda nomor) dengan:
Itu kalau-kalau Anda ingin mengurutkan dalam urutan naik: dari jumlah terkecil ke jumlah terbesar.
sumber
compare()
pernah ada.Gunakan
People implements Comparable<People>
sebaliknya; ini mendefinisikan pemesanan alami untukPeople
.A
Comparator<People>
juga dapat didefinisikan sebagai tambahan, tetapiPeople implements Comparator<People>
bukan cara yang tepat dalam melakukan sesuatu.Dua kelebihan untuk
Collections.sort
berbeda:<T extends Comparable<? super T>> void sort(List<T> list)
Comparable
objek menggunakan pemesanan alami mereka<T> void sort(List<T> list, Comparator<? super T> c)
Comparator
Anda membingungkan keduanya dengan mencoba mengurutkan
Comparator
(yang lagi mengapa itu tidak masuk akalPerson implements Comparator<Person>
). Sekali lagi, untuk menggunakannyaCollections.sort
, Anda perlu salah satunya:Comparable
(gunakan 1-argsort
)Comparator
untuk tipe harus disediakan (gunakan 2-argssort
)Pertanyaan-pertanyaan Terkait
Juga, jangan gunakan tipe mentah dalam kode baru . Jenis mentah tidak aman, dan disediakan hanya untuk kompatibilitas.
Itu, bukannya ini:
Anda harus menggunakan deklarasi generik typesafe seperti ini:
Anda kemudian akan menemukan bahwa kode Anda bahkan tidak dapat dikompilasi !! Itu akan menjadi hal yang baik, karena ada sesuatu yang salah dengan kode (
Person
tidakimplements Comparable<Person>
), tetapi karena Anda menggunakan tipe mentah, kompiler tidak memeriksa ini , dan sebaliknya Anda mendapatkanClassCastException
pada saat run-time !!!Ini harus meyakinkan Anda untuk selalu menggunakan jenis generik typesafe dalam kode baru. Selalu.
Lihat juga
sumber
Demi kelengkapan, berikut adalah metode satu garis sederhana
compare
:sumber
signum
Integer.compare(lhs.getId(), rhs.getId());
adalah pendekatan yang lebih baik. Seperti @ niraj.nijju disebutkan pengurangan dapat menyebabkan overflow.Java 8 menambahkan cara baru untuk membuat Komparator yang mengurangi jumlah kode yang harus Anda tulis, Comparator.comparing . Lihat juga Comparator.reversed
Ini contohnya
sumber
Anda ingin menerapkan Sebanding, bukan Pembanding. Anda perlu menerapkan metode compareTo. Anda sudah dekat. Pembanding adalah perbandingan rutin "pihak ketiga". Sebanding dengan itu objek ini dapat dibandingkan dengan yang lain.
Catatan, Anda mungkin ingin memeriksa nulls di sini untuk getId..hanya dalam kasus.
sumber
Berikut adalah contoh dari Pembanding yang akan bekerja untuk metode zero arg apa pun yang mengembalikan Sebanding. Apakah sesuatu seperti ini ada di jdk atau perpustakaan?
sumber
Demi kelengkapan.
Menggunakan Java8
jika Anda ingin masuk
descending order
sumber
People::getId
?.thenComparing()
klausa ketika ada bentrokan..thenComparing()
?sumber
Solusinya dapat dioptimalkan dengan cara berikut: Pertama, menggunakan kelas dalam pribadi sebagai ruang lingkup untuk bidang adalah menjadi kelas TestPeople terlampir sehingga implementasi kelas Orang tidak akan terkena dunia luar. Ini dapat dipahami dalam hal membuat API yang mengharapkan daftar orang yang diurutkan. Kedua, menggunakan ekspresi Lamba (java 8) yang mengurangi kode, maka upaya pengembangan
Maka kode akan seperti di bawah ini:
sumber
Anda harus menggunakan metode sort (peps, People, (new)) yang kelebihan beban
sumber
Inilah jawaban saya untuk alat pembanding sederhana
}
Alat Utilitas untuk hal yang sama
}
Kelas Info Kolom
sumber
Dua koreksi:
Anda harus membuat
ArrayList
dariPeople
objek:Setelah menambahkan objek ke prep, gunakan:
Juga, tambahkan
CompareId
kelas sebagai:sumber
Jangan buang waktu menerapkan Algoritma Penyortiran oleh Anda sendiri. Sebagai gantinya; menggunakan
Collections.sort () untuk mengurutkan data.
sumber