![](/img/trans.png)
[英]Sorting an ArrayList using another ArrayList field for a Custom Object
[英]Need to do sorting of ArrayList<Object> for a particular field?
我需要根據學生對象中的日期對我的ArrayList進行排序...如果日期(加入日期)相同,那么我需要根據ID對其進行排序...該怎么做?
這可以通過兩種常見方式完成。
簡單的方法
1)讓學生提供可比較的實施,最終將推遲至該日期。 這是一個非常簡單的操作,但是有點麻煩。
可維護的方式
2)另外,Collections.sort方法將Comparator作為輸入-您可以輕松地編寫一個自定義比較器,該實現將輸入轉換為Student類並直接返回數據比較,從而實現排序所需的比較。
第二種解決方案具有更高的模塊化和可維護性,除非按日期進行比較是應用程序的基本,核心方面。
在學生班級中實現可比接口。 然后使用Collections.sort(list);
您可以執行以下操作:
使類實現Comparable
:
public class Student implements Comparable<Student> {
private Date joinDate;
private String id;
//...
@Override
public int compareTo(Student o) {
int result = joinDate.compareTo(o.joinDate);
if(result != 0) {
return result;
}
return id.compareTo(o.id);
}
}
或使用Comparator
:
Comparator<Student> comparator = new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
int result = o1.getJoinDate().compareTo(o2.getJoinDate());
if (result != 0) {
return result;
}
return o1.getId().compareTo(o1.getId());
}
};
Collections
類具有將Comparator
作為參數的sort方法:
List<Student> students;
/* ...students list instantiated and populated somewhere along here... */
Collections.sort(students, new Comparator<Student>() {
@Override
public int compare(Student student1, Student student2) {
return student1.joinDate().compareTo(student2.joinDate());
}
});
我應該補充一點,如果您的列表確實被聲明為Object
通用的,那么您將不得不進行大量的轉換。 該列表應聲明為Student
通用,並且您應具有其他非學生對象列表。
您可以通過以下兩種方式之一執行此操作:
1)在您的對象上實現Comparable接口,然后調用`Collections.sort(yourList);'。
要么
2)實施比較接口的新類(讓我們假設你調用該類StudentDateComparator
。然后你可以的調用Collections.sort(yourList,新StudentDateComparator());`。
我通常更喜歡后者,因為它使我可以將排序代碼與要排序的數據對象分開。
如果Student類基於ID字段實現Comparable,則將Collections.sort()與列表一起用作單個參數。
否則,實現一個Comparator,該Comparator使用對象的ID比較對象,並將其用作Collections.sort()的第二個參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.