Saya memiliki Daftar Objek seperti. List<Object> p
Saya ingin mengurutkan daftar ini menurut abjad menggunakan bidang nama Objek. Objek berisi 10 bidang dan bidang nama adalah salah satunya.
if (list.size() > 0) {
Collections.sort(list, new Comparator<Campaign>() {
@Override
public int compare(final Object object1, final Object object2) {
return String.compare(object1.getName(), object2.getName());
}
} );
}
Tapi tidak ada yang seperti String.compare ..?
Object
Tidak punya nama. Apakah maksud Anda menggunakan.toString()
?object1
danobject2
harus bertipeCampaign
, dan fungsi bandingkan adalahobject1.getName().compareTo(object2.getName())
.List<Object>
danComparator<Campaign>
. Kamu tidak boleh melakukan itu. Entah Anda memilikiList<Object>
danComparator<Object>
atauList<Campaign>
danComparator<Campaign>
Jawaban:
Dari kode Anda, sepertinya Anda
Comparator
sudah diparameterisasi denganCampaign
. Ini hanya akan bekerja denganList<Campaign>
. Juga, metode yang Anda cari adalahcompareTo
.Atau jika Anda menggunakan Java 1.8
Satu komentar terakhir - tidak ada gunanya memeriksa ukuran daftar. Sortir akan berfungsi pada daftar kosong.
sumber
Comparator.comparing(Campaign::getName)
list.sort((object1, object2) -> object1. getName().compareTo(object2. getName()));
bekerja untuk sayasortedList = list.stream().sort((object1, object2) -> object1. getName().compareTo(object2. getName()))..collect(Collectors.toList());
untuk mendapatkan daftar baru yang diurutkanCara paling benar untuk mengurutkan string menurut abjad adalah dengan menggunakan
Collator
, karena internasionalisasi. Beberapa bahasa memiliki urutan berbeda karena sedikit karakter tambahan, dll.Jika Anda tidak peduli tentang penggunaan internasionalisasi
string.compare(otherString)
.sumber
Lihat
Collections.sort()
danComparator
antarmukanya.Perbandingan string dapat dilakukan dengan
object1.getName().compareTo(object2.getName())
atauobject2.getName().compareTo(object1.getName())
(tergantung pada arah pengurutan yang Anda inginkan).Jika Anda ingin jenis menjadi case agnostic, lakukan
object1.getName().toUpperCase().compareTo(object2.getName().toUpperCase())
.sumber
nama
dariObject
jenis? jawaban ini tidak lengkap.Menggunakan Java 8 Comparator.comparing :
sumber
Silakan ganti Objek dengan kelas Anda yang berisi kolom nama
Pemakaian:
sumber
obj1.getName().compareTo(obj2.getName()
denganobj2.getName().compareTo(obj1.getName()
di kelas pembandingsesuatu seperti
sumber
Berikut adalah versi jawaban Robert B yang berfungsi untuk
List<T>
dan menyortir berdasarkan properti String tertentu dari objek menggunakan Refleksi dan tidak ada pustaka pihak ketigasumber
Anda dapat menggunakan
sortThisBy()
dari Koleksi Eclipse :Jika Anda tidak dapat mengubah jenis daftar dari
List
:Catatan: Saya adalah kontributor Koleksi Eclipse.
sumber
Coba ini:
sumber
Jika benda Anda memiliki beberapa nenek moyang [biarlah
T
] Anda harus menggunakanList<T>
bukanList<Object>
, dan menerapkan komparator untuk T ini, menggunakan kolom nama.Jika Anda tidak memiliki leluhur yang sama, Anda dapat mengimplementasikan Comperator, dan menggunakan refleksi untuk mengekstrak nama, Perhatikan bahwa itu tidak aman, tidak disarankan, dan mengalami kinerja buruk untuk menggunakan refleksi, tetapi memungkinkan Anda untuk mengakses nama bidang tanpa mengetahui apa pun tentang jenis objek yang sebenarnya [selain fakta bahwa ia memiliki bidang dengan nama yang relevan]
Dalam kedua kasus, Anda harus menggunakan Collections.sort () untuk mengurutkan.
sumber
Saya menemukan cara lain untuk melakukan tipe.
sumber
Ini mengasumsikan daftar
YourClass
bukanObject
, seperti yang dijelaskan oleh amit .Anda dapat menggunakan bit ini dari pustaka Google Guava:
Jawaban lain yang menyebutkan
Comparator
tidak salah, karenaOrdering
diimplementasikanComparator
. Solusi ini, menurut saya, sedikit lebih mudah, meskipun mungkin lebih sulit jika Anda seorang pemula dan tidak terbiasa menggunakan perpustakaan dan / atau "pemrograman fungsional".Disalin tanpa malu-malu dari jawaban ini pada pertanyaan saya sendiri.
sumber
Menggunakan pilihan Sort
sumber
Collections.sort()
? (2) daftar bertipeList<Object>
, dan karena itulist.get(j).getName()
tidak dapat dikompilasi. (3) solusi ini adalah O (n ^ 2), sedangkan menggunakanCollections.sort()
solusi O (nlogn) yang lebih baik.Jika Anda menggunakan a
List<Object>
untuk menampung objek dari subtipe yang memiliki bidang nama (sebut saja subtipeNamedObject
), Anda harus menurunkan elemen daftar untuk mengakses nama. Anda memiliki 3 opsi, yang terbaik adalah yang pertama:List<Object>
di tempat pertama jika Anda bisa membantunya - simpan objek bernama Anda di aList<NamedObject>
List<Object>
elemen Anda ke aList<NamedObject>
, dalam proses downcasting, lakukan penyortiran, lalu salin kembaliOpsi 3 akan terlihat seperti ini:
sumber
sumber
Jawaban @ Victor berhasil untuk saya dan memposting ulang di sini di Kotlin seandainya berguna bagi orang lain yang menggunakan Android.
sumber