7

この単純なクラスがあるとします:

public class Pair {
    public readonly object first;
    public readonly object second;

    public Pair(object first, object second) {
        this.first = first;
        this.second = second;
    }
}

ペアの巡回グラフを生成することは不可能です。

同様のクラスを作成するにはどうすればよいでしょうか。これは依然として不変ですが、循環グラフを生成するために何らかの方法で使用できます。

4

3 に答える 3

3

グラフ構造を表現する方法は無数にあります。そのような方法の1つは、行列を使用することです。各行と列は頂点によってインデックスが付けられ、マトリックス内の各セルは有向(場合によっては重み付けされた)エッジを表します。0が接続エッジなしで、1が接続エッジがある単純な循環グラフは、次のようになります。

| 0 1 |
| 1 0 |

多くの不変の構造と同様に、それらを構築する方法は、与えられた行列の望ましい関係に基づいて新しい構造を返すことです。たとえば、上記のグラフを取得して、最初の頂点のエッジをそれ自体に追加したい場合、それを表す行列は正しいです。

| 1 0 |
| 0 0 |

それを他のマトリックスと組み合わせるには、それらを足し合わせるだけです。

| 0 1 |  +  | 1 0 |  ==  | 1 1 |
| 1 0 |     | 0 0 |      | 1 0 |

もちろん、行列を表現する方法はたくさんありますが、速度、スペース、およびその他の特定の操作のトレードオフは異なりますが、それは別の問題です。

于 2010-10-24T06:44:57.220 に答える
0

あなたが提案したタイプの厳密に不変のクラスでは、これは不可能だと思います。私が考えることができる唯一のことは、フィールドがnullかどうかをチェックし、nullの場合は設定できるようにするセッターを持つプロパティを追加することです。このようfirstにして、最初のオブジェクトのフィールドをそのままnullにして、サイクルの最後のオブジェクトを作成したら、そのフィールドを適切に設定してループを閉じることができます。一度設定すると null ではなくなり、セッターはそれを変更できなくなります。もちろん、クラス内部のコードによってフィールドを変更することは可能ですが、外部からは基本的に不変です。

このようなもの(C#):

public class Pair {
    private object first;
    private object second;

    public Pair(object first, object second) {
        this.first = first;
        this.second = second;
    }

    public object First {
        get { return first; }
        set 
        {
            if (first == null)
            {
                first = value;
            }
        }
    }

    // and a similar property for second
}
于 2010-10-24T04:23:01.510 に答える
0

私は機能的なアプローチを取り、継続を ctor に渡します。または、代わりに一連の同様の要素を取ることもできます (引数として IEnumerable を考えてください)。

于 2011-04-10T18:45:34.240 に答える