按几个日期字段排序类

时间:2012-07-24 12:41:49

标签: java date sorting

我有一个类“条目”,它有几个日期字段:

  1. creationDate(始终可用)
  2. manualSetDate(并非总是)
  3. meetingDate(并非总是)
  4. 现在我想通过第一次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}...
    ...
    

    导致高度复杂性

    按顺序排序:

    1. 会议日期(如果两者都有)
    2. ManualSetDate(如果两者都有)
    3. CreationDate
    4. 我遍历了所有组合,但它似乎犯了错误......

      有更好的方法进行排序吗?任何想法?

3 个答案:

答案 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() );