-2

作成者の詳細を含む AVLTree であるソフトウェア製品を作成しています。Author クラスには、Name、Year Of Publish、List of Books (LinkedList<> コレクションを使用) が含まれます。Author オブジェクトは、名前を比較のキーとして AVLTree に格納されます。

私の問題は、Author クラスを AVLTree に正しく格納できないように見えることです。

アドバイスや助けに感謝します。

Author 配列を作成し、AVLTree を作成します。

public Author[] author = new Author[i];

public AVLTree<Author> authorAVL = new AVLTree<Author>();

「著者の追加」ボタンのコードは次のとおりです。

        author[i].Name = textBoxAddAuthor.Text;
        author[i].YrOfPub = textBoxYrOfPub.Text;
        author[i] = new Author(author[i].Name, author[i].YrOfPub);
        Array.Sort(author);

        authorAVL.InsertItem(artist[i]);

次のように、 Author クラスに CompareTo を実装しました。

public int CompareTo(object obj)
    {
        if (obj is Author) //compare by name
        {
            Author other = (Author)obj;
            return name.CompareTo(other.name);
        }

AVLTree の InsertItem メソッドは次のようになります。

public void InsertItem(T item)
    {
        insertItem(item, ref root);
    }

    private void insertItem(T item, ref Node<T> tree)
    {
        if (tree == null)
            tree = new Node<T>(item);
        else if (item.CompareTo(tree.Data) < 0)
            insertItem(item, ref tree.Left);
        else if (item.CompareTo(tree.Data) > 0)
            insertItem(item, ref tree.Right);
        tree.BalanceFactor = (height(tree.Left) - height(tree.Right));
        if (tree.BalanceFactor <= -2)
            rotateLeft(ref tree);
        if (tree.BalanceFactor >= 2)
            rotateRight(ref tree);

    }

ノードクラスには次のものが含まれます。

public class Node<T> where T : IComparable
{
    private T data;
    public Node<T> Left, Right;
    private int balanceFactor = 0;

    public Node(T item)
    {
        data = item;
        Left = null;
        Right = null;
    }
    public T Data
    {
        set { data = value; }
        get { return data; }

    }

    public int BalanceFactor
    {
        set { balanceFactor = value; }
        get { return balanceFactor; }
    }


}
4

1 に答える 1

1

問題はここにあるようです:

author[i].Name = textBoxAddAuthor.Text;
author[i].YrOfPub = textBoxYrOfPub.Text;
author[i] = new Author("Name", "yearofpublish");

特に、操作の順序が正しくありません。のプロパティを設定しようとしてauthor[i]いて、それを .. の新しいインスタンスで上書きしてAuthorも意味がありません。

そのはず:

author[i] = new Author(textBoxAddAuthor.Text, textBoxYrOfPub.Text);

また、コード内の他の 3 つの点についても少し混乱しています。

  1. そもそもツリーに Authors を配置しているのに、なぜ Authors を保持する配列も持っているのでしょうか?
  2. なぜこのように autors の配列を初期化するのですか: public Author[] author = new Author[i];. どこiから来たの?
  3. ツリーに挿入するたびに配列をソートするのはなぜですか? 木は自己バランス..

そして、iツリーに挿入する前に作成者を初期化/設定するために再利用しています.. ?!

私には次のブロック:

// where does this i come from here?
author[i].Name = textBoxAddAuthor.Text;                       // this is useless..
author[i].YrOfPub = textBoxYrOfPub.Text;                      // this is useless..
author[i] = new Author(author[i].Name, author[i].YrOfPub);    // overwriting author[i] here
Array.Sort(author);            // why are you sorting the array each time you insert?
authorAVL.InsertItem(artist[i]);

次のように書き直す必要があります。

Author newAuthor = new Author(textBoxAddAuthor.Text, textBoxYrOfPub.Text);
authorAVL.InsertItem(newAuthor);
于 2013-03-15T15:30:13.067 に答える