0

私は次のようArrays.sort(schedule, c);に c がコンパレータのインスタンスである場所を呼び出しています。

import java.util.Comparator;

public class FirstOccComparator implements Comparator<AbstractEvent> {

    public int compare(AbstractEvent event1, AbstractEvent event2) {        
          int result = 0;       
          if (event1 == null || event2 == null) {
              //System.out.println("null");
          }
          else if (event1.hasMoreOccurrences() && event2.hasMoreOccurrences()) {
            result = event1.nextOccurrence().compareTo(event2.nextOccurrence());
          }
          return result;
    }

}

私が得ている出力は、本来あるべきものではありません。ここで誰かが私を正しい方向に向けることができるかどうか疑問に思っています。これは私が今までに作成した最初の並べ替えアルゴリズムであり、まだ私にとって新しい概念 (コンパレータと実装) を使用しているため、私のコードに関する複数の質問について申し訳ありません:)

編集 これは出力の違いです: http://pastebin.com/LWy1jqkt

イベントには 2 種類あります。これらは hasMoreOccurrences() メソッドと nextOccurrence() メソッドです。

デイリーイベント

public boolean hasMoreOccurrences() {
        boolean result = false;
        Date check = nextOccurrence();
        timesCalled--;
        if (check instanceof Date && check != null) {
            result = true;
        }
        return result;
    }

public Date nextOccurrence() {
        if (timesCalled > recurrences) {
            return null;
        }
        else {
            Calendar cal = Calendar.getInstance();
            cal.setTime(startTime);
            cal.add(Calendar.DATE, timesCalled);
            timesCalled++;
            return cal.getTime();
        }
    }

ウィークリーイベント

public boolean hasMoreOccurrences() {
        Date tmp = nextOccurrence();
        timesCalled--;
        boolean result = false;
        if (tmp instanceof Date && tmp != null) {
            result = true;
        }

        return result;
    }

public Date nextOccurrence() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(startTime);
        cal.add(Calendar.DATE, timesCalled*7);

        if (cal.getTime().compareTo(this.endTime) > 0) {
            return null;
        }
        else {
            timesCalled++;
            return cal.getTime();
        }
    }
4

4 に答える 4

2

コンパレーターには、正しくないように見える点がいくつかあります。

たとえば、そのうちの 1 つだけが null の場合はどうなりますか? それらをどのように並べ替えますか?現在、2 つのイベントのうちの 1 つが null の場合に等しいと考えています。

また、一方のイベントの発生回数が多く、もう一方のイベントの発生回数が少ない場合はどうなりますか? 現時点では、両方のイベントの発生回数が多い場合にのみ、発生回数の比較を行います。一方にはオカレンスがあり、もう一方にはオカレンスがない場合を処理する必要があります。

また、オカレンスがカスタム クラスの場合は、そのコンパレーターも評価する必要があります。

于 2011-02-27T18:19:14.210 に答える
1

行動が想定と一致しない場合は、おそらく想定を確認するときです。

「...本来あるべきものではありません...」は、出力と一致しない Comparator の動作方法についての概念を持っていることを示唆しています。Collections に組み込まれている並べ替えアルゴリズムは証明されているため、クラスとその Comparator でエラーを確認する必要があると思います。

いくつかの単体テストを作成し、どこが間違っているかを確認してください。

結果とソートしているクラスを見なければ、次に何をすべきかについてアドバイスすることは不可能です.

于 2011-02-27T18:18:27.293 に答える
0

event1 と event2 が null ではなく、一方 (または両方) のオカレンスがなくなった場合はどうなるでしょうか。

于 2011-02-27T18:19:17.810 に答える
0

平等を判断するためのアルゴリズムには深刻な欠陥があります。詳細については、http: //blogs.msdn.com/b/oldnewthing/archive/2003/10/23/55408.aspx?wa=wsignin1.0を参照してください。

于 2011-02-27T18:19:44.643 に答える