我有一个类“条目”,它有几个日期字段:
现在我想通过第一次meetDate(将会议的所有条目放在一起)对条目进行排序,然后或者如果手动设置日期在一个条目中不可用,并且他们有相同的会议或者如果一个条目没有manualSetDate也由creationDate。
组成困难在于许多条目没有会议或手动设置日期。所以我迭代了所有(我希望如此)可能的组合,如:
Date relevant1; //at the end i compare both relevant dates
Date relevant2;
if e1.creationdate != null && e2.creationdate == null)
{relevant2 = e2.creationdate}...
if e1.creationdate == null && e2.creationdate != null)
{relevant2 = e2.creationdate}...
...
导致高度复杂性
按顺序排序:
我遍历了所有组合,但它似乎犯了错误......
有更好的方法进行排序吗?任何想法?
答案 0 :(得分:1)
我想我会在我的条目中创建一个找到“相关”日期的函数。然后让你的compareTo使用那个新功能。这样就不会像上面的代码那样考虑所有可能的组合。
public class Entry implements Comparable<Entry>
{
private Date getAvailableDate()
{
if (meetingDate != null)
return meetingDate;
else if (manualSetDate != null)
return manualSetDate;
else
return creationDate;
}
public int compareTo(Entry other)
{
return this.getAvailableDate().compareTo(other.getAvailableDate());
}
}
答案 1 :(得分:0)
最好编写自己的Comparator
并实现compare
方法,如下面的代码
class MyComparator implements Comparator<DateEntry>{
@Override
public int compare(DateEntry o1, DateEntry o2) {
int i = o1.creationDate.compareTo(o2.creationDate);
if (i != 0) return i;
if(o1.manualSetDate!=null&&o2.manualSetDate!=null)
i = o1.manualSetDate.compareTo(o2.manualSetDate);
if (i != 0) return i;
if(o1.meetingDate!=null&&o2.meetingDate!=null)
i = o1.meetingDate.compareTo(o2.meetingDate);
if (i != 0) return i;
return i;
}
}
然后将它们排序为。
Collections.sort(list,new MyComparator ());
答案 2 :(得分:0)
我建议您使用Comparator来定义顺序,然后使用一些库函数来进行实际排序。我也会在比较方法中获得多个早期回报。实施如下:
public class Entry {
...
public Date getMeetingDate() { return meetingDate;}
public Date getManualSetDate() { return manualSetDate; }
public Date getCreationDate() { return creationDate; }
}
public class EntryComparator implements Comparator<Entry> {
@Override
public int compare(Entry o1, Entry o2) {
if (o1.getMeetingDate() != null && o2.getMeetingDate() != null) {
int compared = o1.getMeetingDate().compareTo(o2.getMeetingDate());
if (compared != 0) {
return compared;
}
}
if (o1.getManualSetDate() != null && o2.getManualSetDate() != null) {
int compared = o1.getManualSetDate().compareTo(o2.getManualSetDate());
if (compared != 0) {
return compared;
}
}
return o1.getCreationDate().compareTo(o2.getCreationDate());
}
}
//and actual sorting:
List<Entry> entries ...
Collections.sort( entries, new EntryComparator() );