Rumah > Java > javaTutorial > Bagaimana untuk Mengisih Senarai Objek dalam Java Menggunakan Pelbagai Medan?

Bagaimana untuk Mengisih Senarai Objek dalam Java Menggunakan Pelbagai Medan?

DDD
Lepaskan: 2024-10-28 14:17:02
asal
402 orang telah melayarinya

 How to Sort a List of Objects in Java Using Multiple Fields?

Isih Tersuai Objek Senarai dengan Pelbagai Medan dalam Java

Walaupun menyusun objek dalam senarai berdasarkan satu medan adalah mudah, pengisihan menggunakan berbilang medan boleh menjadi agak rumit . Artikel ini membincangkan isu pengisihan mengikut berbilang medan dan meneroka pelbagai penyelesaian yang tersedia di Java.

Masalahnya

Pertimbangkan senario di mana anda mempunyai senarai objek "Laporkan" dengan tiga medan : Kunci Laporan, Nombor Pelajar dan Sekolah. Anda ingin mengisih senarai ini menggunakan ketiga-tiga medan dalam susunan tertentu.

Coretan kod yang anda berikan cuba mengisih senarai menggunakan Collections.sort dengan Comparator tersuai, tetapi atas sebab tertentu, pengisihan tidak berfungsi seperti yang dijangka. Anda mengesyaki mungkin terdapat masalah dengan kod.

Analisis

Kod anda sememangnya mempunyai masalah. Mari kita analisa masalah dan kenal pasti penyelesaian yang betul.

Kod Betul

Isu dalam kod yang disediakan terletak pada gabungan tiga medan:

<code class="java">return (record1.getReportKey() + record1.getStudentNumber() + record1.getSchool()).compareTo(record2.getReportKey() + record2.getStudentNumber() + record2.getSchool());</code>
Salin selepas log masuk

Penggabungan ini menganggap bahawa medan adalah jenis String. Walau bagaimanapun, dalam kes anda, ketiga-tiga medan ditakrifkan sebagai jenis Rentetan, jadi penggabungan hanya akan menghasilkan perbandingan rentetan. Ini mungkin bukan yang anda maksudkan.

Untuk membandingkan medan dengan betul, anda perlu membandingkannya secara individu dan dalam susunan yang betul:

<code class="java">return Comparator.comparing(Report::getReportKey)
        .thenComparing(Report::getStudentNumber)
        .thenComparing(Report::getSchool)
        .compare(record1, record2);</code>
Salin selepas log masuk

Penyelesaian Alternatif

Dalam Selain kod yang diperbetulkan, berikut ialah penyelesaian alternatif untuk mengisih mengikut berbilang medan dalam Java:

Pilihan 1: Pengisihan Reflektif Menggunakan BeanComparator

BeanComparator boleh digunakan untuk mengisih objek berdasarkan getter. Walau bagaimanapun, ia mudah ralat dan kurang cekap disebabkan penggunaan pantulan.

Pilihan 2: Rantaian Perbandingan Guava Google

Google Guava menyediakan cara yang mudah untuk merantai berbilang perbandingan. Ia juga mengendalikan nilai nol dengan anggun.

Pilihan 3: Apache Commons CompareToBuilder

Kelas perpustakaan ini serupa dengan ComparisonChain Guava tetapi mempunyai gelagat lalai yang sedikit berbeza untuk nilai null.

Kesimpulan

Penyelesaian yang betul untuk masalah anda ialah menggunakan kod yang disemak dengan perbandingan medan individu. Sebagai alternatif, anda boleh memilih salah satu daripada pilihan lain yang dibincangkan di atas berdasarkan keperluan khusus anda. Memahami prinsip pengisihan mengikut berbilang medan dan perbezaan antara alatan yang tersedia akan membolehkan anda mengendalikan senario pengisihan kompleks dalam aplikasi Java anda dengan berkesan.

Atas ialah kandungan terperinci Bagaimana untuk Mengisih Senarai Objek dalam Java Menggunakan Pelbagai Medan?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan