0

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

  1. 创建日期(始终可用)
  2. manualSetDate(不总是)
  3. 会议日期(不总是)

现在我想按第一个 meetingDate 对条目进行排序(将会议的所有条目放在一起),然后或者如果在一个条目中不可用,则按 manualSetDate,如果他们有相同的会议,或者如果一个条目没有 manualSetDate 也按创建日期。

困难在于许多条目没有会议或手动设置日期。所以我已经迭代了所有(我希望如此)可能的组合,比如:

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. 创建日期

我遍历了所有组合,但似乎会出错......

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

4

3 回答 3

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());
   }

}
于 2012-07-24T13:24:05.293 回答
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 ());
于 2012-07-24T13:10:15.910 回答
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() );
于 2012-07-24T13:15:22.263 回答