0

いくつかの日付フィールドを持つクラス「エントリ」があります。

  1. CreationDate(常に利用可能)
  2. manualSetDate(常にではありません)
  3. MeetingDate(常にではありません)

ここで、最初のmeetingDate(会議のすべてのエントリをまとめる)でエントリを並べ替え、次に、manualSetDateで1つのエントリで使用できない場合、同じ会議がある場合、または1つのエントリに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. ミーティングの日付(両方に1つある場合)
  2. ManualSetDate(両方に1つある場合)
  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

コンパレータを使用して順序を定義し、次にライブラリ関数を使用して実際の並べ替えを行うことをお勧めします。また、compareメソッドで複数の早期リターンを取得します。実装は次のようなものです。

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 に答える