Seringkali perlu untuk mengurutkan daftar, dari daftar <string> untuk mengurutkan kelas khusus. Tidak perlu menggabungkan atau menumpuk sendiri. Iklementasikan satu antarmuka.
Artikel ini pertama -tama akan memperkenalkan penggunaan koleksi untuk mengurutkan daftar <string> , dan kemudian berbicara tentang prinsip koleksi.
Mari kita bicara tentang cara mengurutkan kelas kustom.
Akhirnya , metode lain menyortir objek kustom menggunakan jenis koleksi akan diperkenalkan, dan kedua jenisnya adalah perbandingan kinerja sederhana.
1. Prinsip daftar penyortiran <string> dan collections.sort
Kodenya adalah sebagai berikut
Daftar <String> StringList = ArrayList baru <string> (); StringList.Add ("Nice"); stringlist.add ("lezat"); stringlist.add ("mampu"); stringlist.add ("moon"); stringlist.add ("coba"); stringlist.add ("teman"); Collections.sort (stringlist); untuk (string str: stringList) {System.out.println (str); }Di mana koleksi adalah java.util.collections.
Lihat implementasi Sort dalam koleksi
@SuppressWarnings ("Uncecked") Public Static <T Extends Comparable <? super t >> void sort (daftar <t> daftar) {objek [] array = list.toArray (); Arrays.sort (array); int i = 0; ListIterator <T> it = list.listIterator (); while (it.hasnext ()) {it.next (); it.set ((t) array [i ++]); }}Dari sini kita dapat melihat bahwa badan penyortiran adalah arrays.sort (array); Implementasi array semacam itu
public static void sort (objek [] array) {// mulai android-changed comparableTimsort.sort (array); // akhiri Android-changed}Lanjutkan untuk melacak, ComportableTimSort's Sorts Implementation ComparatableTimsort.sort
static void sort (objek [] a) ke statis void sort (objek [] a, int lo, int hi) ke private static void binarysort (objek [] a, int lo, int hi, int start). Di Binarysort, bagian yang digunakan untuk perbandingan ukuran adalah
Sebanding <Pape> pivot = (sebanding) a [start]; int kiri = lo; int right = mulai; menegaskan kiri <= kanan; while (kiri <kanan) {int mid = (kiri + kanan) >>> 1; if (pivot.compareto (a [mid]) <0) kanan = mid; lain kiri = mid + 1; }Compareto objek akan dipanggil untuk perbandingan. Secara default, tipe string dan integer telah ditimpa dengan metode CompareTo. Jadi Anda bisa membandingkannya sendiri
2. Perbandingan kelas khusus
Melalui pengantar di atas, kami memahami prinsip penyortiran koleksi. Berikut ini adalah memperkenalkan penyortiran objek kustom. Pertama, periksa prinsip perbandingan integer dan string, dan kemudian perkenalkan cara membandingkan kelas khusus.
2.1 Kami memeriksa implementasi objek dan menemukan bahwa tidak ada metode compareto.
Lihatlah definisi integer
Integer kelas akhir publik memperluas bilangan mengimplementasikan yang sebanding <Integer>
Mari kita lihat definisi string
String kelas akhir publik mengimplementasikan java.io.serializable, sebanding <string>, charsequence
Kita dapat menemukan bahwa mereka semua mewarisi dari yang sebanding
2.2 Lihat antarmuka yang sebanding
Anda dapat menemukan bahwa hanya ada satu metode yang sebanding
Kode Java
Public Int Compareto (T o);
Dengan kata lain, metode BinarySort sebenarnya menyebut metode compareto yang sebanding, sehingga dapat mengetahui bahwa selama itu diwarisi dari yang sebanding,
Dan mengimplementasikan compareTo untuk memanggil koleksi.sort untuk mengurutkan objek kustom
2.3 Perbandingan Kelas Kustom
Kode berikut adalah mengurutkan pengguna. Pertama, urutkan dengan nama satu per satu. Jika namanya sama, urutkan dari kecil ke besar berdasarkan usia.
Kode Java
Public Class Maintest {public static void main (string [] args) {list <user> userlist = new ArrayList <User> (); userlist.add (pengguna baru ("lucy", 19)); userlist.add (pengguna baru ("jack", 19)); userlist.add (pengguna baru ("Jim", 19)); userlist.add (pengguna baru ("James", 19)); userlist.add (pengguna baru ("Herry", 19)); userlist.add (pengguna baru ("luccy", 19)); userlist.add (pengguna baru ("James", 18)); userlist.add (pengguna baru ("herry", 20)); Collections.sort (UserList); untuk (pengguna pengguna: userList) {System.out.println (user.getName () + "/t/t" + user.getage ()); }} Pengguna kelas statis private Static Implement sebanding <user> {private string name; usia int pribadi; pengguna publik (nama string, int usia) {this.name = name; this.age = usia; } @Override public int compareTo (pengguna lain) {int compareName = this.name.compareto (Other.getName ()); if (compareName == 0) {return (this.age == Other.getage ()? 0: (this.age> Other.getage ()? 1: -1)); } return compareName; } public string getName () {return name; } public int getage () {usia kembali; }}}Setelah eksekusi, outputnya adalah:
Kode XML:
Herry 19 Herry 20 Jack 19 James 18 James 19 Jim 19 Luccy 19 Lucy 19
Dapat dilihat bahwa hanya diperlukan dua poin
A. Diwarisi dari sebanding
Kode Java
Pengguna kelas statis pribadi mengimplementasikan <user> yang sebanding dengan <us>
B. Menerapkan metode compareto
CompareTo int publik di atas (pengguna lain) adalah subjek perbandingan
Anda dapat melihat bahwa INT CompareName = this.name.compareto (Other.getName ()); berarti nama perbandingan
Jika lebih besar dari atau dikembalikan 1, itu sama untuk mengembalikan 0, dan jika kurang dari, itu akan kembali -1 .
Jika sama, bandingkan sesuai dengan ukuran usia int.
Di atas lebih besar dari atau sama dengan pengembalian 1, dan di atas kurang dari pengembalian -1, yang juga merupakan dasar untuk perbandingan binersort.
3. Gunakan fungsi Koleksi yang kelebihan beban untuk mengurutkan objek kustom
Kode adalah sebagai berikut, dan namanya masih dibandingkan terlebih dahulu, jika mereka sama, maka output usia dibandingkan
Kode Java
Public Class Maintest {public static void main (string [] args) {list <user> userlist = new ArrayList <User> (); userlist.add (pengguna baru ("lucy", 19)); userlist.add (pengguna baru ("jack", 19)); userlist.add (pengguna baru ("Jim", 19)); userlist.add (pengguna baru ("James", 19)); userlist.add (pengguna baru ("Herry", 19)); userlist.add (pengguna baru ("luccy", 19)); userlist.add (pengguna baru ("James", 18)); userlist.add (pengguna baru ("herry", 20)); Collections.sort (UserList, Comparator baru <User> () {public int Compare (user user1, user user2) {int compareName = user1.getName (). CompareTo (user2.getname ()); if (if compareName) {return () () () == User2.getage ()? 0: (); User1. CompareName;}}); untuk (pengguna pengguna: userList) {System.out.println (user.getName () + "/t/t" + user.getage ()); }} private static class user {private string name; usia int pribadi; pengguna publik (nama string, int usia) {this.name = name; this.age = usia; } public string getName () {return name; } public int getage () {usia kembali; }}}Anda bisa melihat itu
Kode Java
Collections.sort (UserList, New Comparator <User> ()))
Ini adalah subjek perbandingan dan mengimplementasikan metode perbandingan pembanding. Berikut ini adalah prinsip dari metode ini
Koleksi Lacak
Kode Java
Public Static <T> void sort (Daftar <T> Daftar, Komparator <? Super T> C)
tiba
Kode Java
public static <T> void sort (t [] a, pembanding <? super t> c)
tiba
Kode Java
private static void mergeSort (objek [] src, objek [] dest, int low, int high, int, pembanding c)
Anda dapat menemukan kode sebagai berikut:
Kode Java
if (length <insertionsor_threshold) {for (int i = low; i <high; i ++) untuk (int j = i; j> rendah && c. kembali; }Metode Bandingkan Panggilan Pembanding
4. Perbandingan dua pertunjukan penyortiran di atas
Binarysort perlu melakukan perbandingan nlg (n) , dan paling buruk, n^2 gerakan
Mergesort terus melakukan divisi biner, dan setelah divisi biner dibagi menjadi bagian -bagian kecil, dimasukkan dan disortir. Jadi, waktu NLG (n) akan dibandingkan dan waktu NLG (n) akan dipindahkan . Tetapi perlu menyalin salinan data sumber terlebih dahulu, jadi itu akan memakan waktu dua kali lipat ruang
Jadi Anda dapat memilih sesuai dengan kebutuhan Anda
Artikel di atas secara singkat membahas pemesanan array atau daftar objek dan prinsip penyortiran koleksi adalah semua konten yang saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.