1

複数の値を格納し、これらの値の 1 つをツリーの並べ替え (バランス調整) の比較に使用される「メイン」変数として扱うことができるオブジェクト ノードを含む二分探索ツリーを作成する方法はありますか? .

例:

ツリー =Artistコレクション

  • それぞれは、などのArtistプロパティを持つノードであり、NameAge
  • Nameツリーのソート/バランスをとる際の比較に使用される「主要な」プロパティです。

これは私がノード定義のために試したものですが、前述の機能について助けが必要です:

    class Artist<T> where T : IComparable
{
    private T name;
    private T members;

    public Artist<T> Left, Right;

    public Artist(T Name, T Members)
    {
        name = Name;
        members = Members;
        Left = null;
        Right = null;
    }
    public T Name
    {
        set { name = value; }
        get { return name; }
    }
    public T Members
    {
        set { members = value; }
        get { return members; }
    }


} 
4

1 に答える 1

0

メンバー値の 1 つをソート用の「メイン」値にするには...

これらのノードが直接比較できるように、IComparableインターフェイスをクラスに直接実装する必要があります。これにより、このクラスのインスタンスを比較する方法Artistを制御できます。

これを行うには、基本的に、関心のあるメンバーで比較を実行し、その結果をオブジェクトの比較の結果として返すだけです。

Eg:

class Artist : IComparable
{
    /* Your Artist specific implementation here */
    private string name;
    private int age;
    ...

    /* Implementation of IComparable */
    public int CompareTo(object obj)
    {
        Artist compareToObj = (Artist)obj;

        // Comparison by name.
        return this.name.CompareTo(compareToObj.name);

        // And if you wanted to do the comparison by eg age:
        // return this.age.CompareTo(compareToObj.age);
    }
} 

Regarding your use of a generic node:

I'm not sure why you've made your Artist class generic - I would assume that an Artist is not generic as you have known properties etc for an artist.. At least, I can't see that that's of any use in the context of this question. Your BinarySearchTree implementation should be generic, however, such that it can be a tree of Artists, Cars, Gerbils or whatever other Object you see fit to use in a BST.

ただし、ジェネリックなクラスが必要な場合はMyGenericNode、任意のタイプのノードを許可します。はい、それをジェネリックにし、指定されたタイプがコードに従って IComparable であることを確認します。しかし、の特定の実装に依存する以外に、 のどMyGenericNodeのメンバーを比較するかを「知る」方法はありません。<T><T>.CompareTo()

「空想的」(読み: 乱雑、複雑、やり過ぎ...) を取得したい場合は、ノード比較が行わ れるメンバーの名前を渡すことができる独自のインターフェイスを作成できると思います。に加えて、新しいインターフェースも実装する必要があります。次に、リフレクションを使用して指定されたメンバーを「検索」し、それを比較します。これを行わないことを強くお勧めします-これを質問への「答え」としてここに置いてください;-)IComparisonMemberSpecifiableIComparable<T>IComparableMyGenericNode<T>

しかし実際には、さまざまなクラスのノードを受け入れるためにジェネリックである必要があるのはツリーです。あなたのノードクラスは一般的なIMHOである必要があります/すべきではありません。

于 2013-03-20T00:08:01.560 に答える