Berikut tutorial tentang memesan objek:
Meskipun saya akan memberikan beberapa contoh, saya akan merekomendasikan untuk tetap membacanya.
Ada berbagai cara untuk mengurutkan file ArrayList
. Jika Anda ingin mendefinisikan pengurutan natural (default) , Anda harus membiarkan implementasinya . Dengan asumsi bahwa Anda ingin mengurutkan secara default , maka lakukan (nullcheck dihilangkan agar lebih mudah):Contact
Comparable
name
public class Contact implements Comparable<Contact> {
private String name;
private String phone;
private Address address;
public int compareTo(Contact other) {
return name.compareTo(other.name);
}
// Add/generate getters/setters and other boilerplate.
}
sehingga Anda bisa melakukannya
List<Contact> contacts = new ArrayList<Contact>();
// Fill it.
Collections.sort(contacts);
Jika Anda ingin menentukan pengurutan terkontrol eksternal (yang menggantikan pengurutan alami), Anda perlu membuat Comparator
:
List<Contact> contacts = new ArrayList<Contact>();
// Fill it.
// Now sort by address instead of name (default).
Collections.sort(contacts, new Comparator<Contact>() {
public int compare(Contact one, Contact other) {
return one.getAddress().compareTo(other.getAddress());
}
});
Anda bahkan dapat menentukan Comparator
s Contact
itu sendiri sehingga Anda dapat menggunakannya kembali daripada membuatnya kembali setiap saat:
public class Contact {
private String name;
private String phone;
private Address address;
// ...
public static Comparator<Contact> COMPARE_BY_PHONE = new Comparator<Contact>() {
public int compare(Contact one, Contact other) {
return one.phone.compareTo(other.phone);
}
};
public static Comparator<Contact> COMPARE_BY_ADDRESS = new Comparator<Contact>() {
public int compare(Contact one, Contact other) {
return one.address.compareTo(other.address);
}
};
}
yang dapat digunakan sebagai berikut:
List<Contact> contacts = new ArrayList<Contact>();
// Fill it.
// Sort by address.
Collections.sort(contacts, Contact.COMPARE_BY_ADDRESS);
// Sort later by phone.
Collections.sort(contacts, Contact.COMPARE_BY_PHONE);
Dan untuk menyempurnakannya, Anda dapat mempertimbangkan untuk menggunakan komparator javabean generik :
public class BeanComparator implements Comparator<Object> {
private String getter;
public BeanComparator(String field) {
this.getter = "get" + field.substring(0, 1).toUpperCase() + field.substring(1);
}
public int compare(Object o1, Object o2) {
try {
if (o1 != null && o2 != null) {
o1 = o1.getClass().getMethod(getter, new Class[0]).invoke(o1, new Object[0]);
o2 = o2.getClass().getMethod(getter, new Class[0]).invoke(o2, new Object[0]);
}
} catch (Exception e) {
// If this exception occurs, then it is usually a fault of the developer.
throw new RuntimeException("Cannot compare " + o1 + " with " + o2 + " on " + getter, e);
}
return (o1 == null) ? -1 : ((o2 == null) ? 1 : ((Comparable<Object>) o1).compareTo(o2));
}
}
yang dapat Anda gunakan sebagai berikut:
// Sort on "phone" field of the Contact bean.
Collections.sort(contacts, new BeanComparator("phone"));
(seperti yang Anda lihat di kode, mungkin bidang kosong sudah tercakup untuk menghindari NPE selama pengurutan)
String.CASE_INSENSITIVE_ORDER
dan teman-teman, tetapi saya menyukainya. Membuat kode yang dihasilkan lebih mudah dibaca.static
dan mungkinfinal
juga ... Atau sesuatu seperti itu ..(o1 == null && o2 == null) ? 0 :
di awal garis pengembalian itu?)Selain apa yang telah diposting, Anda harus tahu bahwa sejak Java 8 kita dapat mempersingkat kode kita dan menulisnya seperti:
atau karena Daftar sekarang memiliki
sort
metodePenjelasan:
Sejak Java 8, antarmuka fungsional (antarmuka dengan hanya satu metode abstrak - mereka dapat memiliki lebih banyak metode default atau statis) dapat dengan mudah diimplementasikan menggunakan:
arguments -> body
source::method
.Karena
Comparator<T>
hanya memiliki satu metode abstrakint compare(T o1, T o2)
itu adalah antarmuka fungsional.Jadi alih-alih (contoh dari jawaban @BalusC )
kita dapat mengurangi kode ini menjadi:
Kita dapat menyederhanakan lambda ini (atau yang lainnya) dengan melewatkan
{return
...}
Jadi, bukan
kita bisa menulis
Juga sekarang
Comparator
memiliki metode statis seperticomparing(FunctionToComparableValue)
ataucomparing(FunctionToValue, ValueComparator)
yang dapat kita gunakan untuk membuat Pembanding dengan mudah yang harus membandingkan beberapa nilai tertentu dari objek.Dengan kata lain kita dapat menulis ulang kode di atas sebagai
sumber
Halaman ini memberi tahu Anda semua yang perlu Anda ketahui tentang pengurutan koleksi, seperti ArrayList.
Pada dasarnya Anda perlu
Contact
kelas Anda mengimplementasikanComparable
antarmuka denganpublic int compareTo(Contact anotherContact)
di dalamnya.Collections.sort(myContactList);
,myContactList
adalahArrayList<Contact>
(atau setiap koleksi lainContact
).Ada cara lain juga, melibatkan pembuatan kelas Comparator, dan Anda dapat membacanya dari halaman yang ditautkan juga.
Contoh:
sumber
BalusC dan bguiz telah memberikan jawaban yang sangat lengkap tentang cara menggunakan Pembanding bawaan Java.
Saya hanya ingin menambahkan bahwa google-collections memiliki kelas Pemesanan yang lebih "bertenaga" daripada Pembanding standar. Mungkin layak untuk dicoba. Anda dapat melakukan hal-hal keren seperti meracik Pengurutan, membalikkannya, mengurutkan tergantung pada hasil fungsi untuk objek Anda ...
Berikut adalah postingan blog yang menyebutkan beberapa manfaatnya.
sumber
Anda perlu membuat kelas Contact Anda mengimplementasikan Comparable , lalu mengimplementasikan
compareTo(Contact)
metode tersebut. Dengan begitu, Collections.sort akan dapat mengurutkannya untuk Anda. Per halaman yang saya tautkan, bandingkanTo 'mengembalikan bilangan bulat negatif, nol, atau bilangan bulat positif karena objek ini kurang dari, sama dengan, atau lebih besar dari objek yang ditentukan.'Misalnya, jika Anda ingin mengurutkan berdasarkan nama (A sampai Z), kelas Anda akan terlihat seperti ini:
sumber
Dengan menggunakan lambdaj Anda dapat mengurutkan koleksi kontak Anda (misalnya dengan nama mereka) sebagai berikut
atau dengan alamat mereka:
dan seterusnya. Secara umum, ia menawarkan DSL untuk mengakses dan memanipulasi koleksi Anda dalam banyak cara, seperti memfilter atau mengelompokkan kontak Anda berdasarkan beberapa kondisi, menggabungkan beberapa nilai propertinya, dll.
sumber
Collections.sort adalah implementasi pengurutan yang baik. Jika Anda tidak memiliki The Comparable yang diimplementasikan untuk Contact, Anda harus meneruskan implementasi Comparator
Catatan:
Jenis gabungan mungkin lebih baik daripada kebanyakan algoritma pencarian yang dapat Anda lakukan.
sumber
Saya melakukannya dengan cara berikut. nomor dan nama adalah dua daftar larik. Saya harus mengurutkan nama. Jika terjadi perubahan pada urutan nama arralist maka nomor arraylist juga berubah urutannya.
sumber
gunakan metode ini:
`
dan penggunaan:
mySortedlist = sortList(myList);
Tidak perlu menerapkan pembanding di kelas Anda. Jika Anda ingin membalikkan order swap1
dan-1
sumber
Oke, saya tahu ini sudah lama dijawab ... tapi, ini beberapa info baru:
Misalnya kelas Contact yang dimaksud sudah memiliki pengurutan natural yang ditentukan melalui implementasi Comparable, tetapi Anda ingin menimpa pengurutan itu, misalnya dengan nama. Inilah cara modern untuk melakukannya:
Dengan cara ini ia akan mengurutkan berdasarkan nama terlebih dahulu (dalam urutan terbalik), dan kemudian untuk tabrakan nama, ia akan kembali ke urutan 'alami' yang diterapkan oleh kelas Contact itu sendiri.
sumber
Anda harus menggunakan fungsi Arrays.sort. Kelas yang berisi harus mengimplementasikan Comparable.
sumber