-2

インターフェイスの 2 つのオブジェクトを比較するメソッドを実装したいと思いますTask。には厳密な部分順序しかないため、2 つのオブジェクトが比較できない場合にのみ、TaskpartialCompareTo返す必要があります。null

厳密な半順序付けの概念に混乱している場合は、こちらを確認してください: https://en.wikipedia.org/wiki/Partially_ordered_set

動機: 一部のタスクには、別のタスクの前または後に実行する必要があるという制約があります。次に、これを使用してタスクをトポロジカルに並べ替えます。つまり、すべての制約が満たされるようにタスクを配置します。

Task aおよびのすべてのインスタンスに対して、次のプロパティが必要ですb

  • もしそうa.partialCompareTo(b) != nullならsgn(a.partialCompareTo(b)) = -sgn(b.partialCompareTo(a))
  • もしそうa.partialCompareTo(b) = nullならb.partialCompareTo(a) = null

注:Comparable標準ライブラリのインターフェイスは使用できません。Task: in returnsには完全な順序付けがないためです。2 つのオブジェクトがincomparableである場合、適切な結果を得る方法はありません。特に、その実装のインスタンスが互いに比較できないTask の実装があります(ただし、 をオーバーライドする Task の他のサブクラスのインスタンスと比較できる場合があります)。compareToComparableint partialCompareTo

partialCompareToクラスで指定されたメソッドをオーバーライドする場合、引数のメソッドを使用するという考え方ですTask

次のアプローチは、実際の試行というよりも冗談です。比較できない 2 つのオブジェクトが比較されるたびに StackOverflowError が発生するためです (これはキャッチされますが、とにかくこれは実現不可能です)。

public class Task implements TopologicalComparable<Task> {

    /*
     * other code
     */

    @Override
    public Integer partialCompareTo(Task other) {
        Integer result;
        try {
            result = - other.partialCompareTo(this);
        } catch (StackOverflowError | NullPointerException e) {
            return null;
        }
        return null;
    }

}

次の実装は明らかに優れていますが、常にヘルパー メソッドをオーバーライドする必要があるという欠点がありますoverridesDefaultPartialCompareTo

public class Task implements TopologicalComparable<Task> {

    /*
     * other code
     */

    @Override
    public Integer partialCompareTo(Task other) {
        if (other.overridesDefaultPCompareTo()) {
            Integer revComp = other.overridesDefaultPartialCompareTo(this);
            if (revComp != null) {
                return - revComp;
            }
        }
        return null;
    }

    public default boolean overridesDefaultPartialCompareTo() {
        return false;
    }

}

メソッドがコードで上書きされているかどうかを確認する方法はありますか?

または、私の問題を解決するための代替アプローチはありますか?

4

2 に答える 2

0

リビジョンはわずかに良くなり、より理にかなっています。有難うございます。まず、オブジェクトを比較していることを理解する必要があります。compareTo() メソッドを書きたい場合は、「何を比較するのか」について考える必要があります。メソッドを作成するには、何を比較しているのかを説明する必要があります。心の中では、セット内の要素を比較している可能性があります。しかし、プログラミングの世界では、int、string、または w/e を比較しています。だから私はあなたに尋ねます、あなたは何を比較していますか?比較している w/e のクラスを作成する必要があります。

class POsetElement{...
//make some sort of set element object
}

このクラスでは、次のように同等のものを実装する必要があります。

class POsetElement implements comparable{...
//make some sort of set element object...

//then make w/e other methods you need...

//now use compareTo() override
@override
compareTo(){
//make your custom method
}
}

compareTo() メソッドを POsetElement クラス内に配置する方法に注意して ください。Java は OOP です。つまり、オブジェクト指向プログラミングです。カスタム ビルド オブジェクトが必要です。独自の世界を作り、独自のオブジェクトを作成する必要があります。このすべてをあなたに説明できる方法はありません。もう少し努力して、Java プログラミングをもっと学んでください。また、理解する必要があるのは、これらは非常に基本的なことであり、Java の基本について少し読む必要があることをもう一度繰り返します。幸運を。

于 2016-03-05T19:10:07.377 に答える