0

これらは私のフィールドです:

public class BSTSet <E> extends AbstractSet <E> {

    // Data fields
    private BSTNode root;
    private int count = 0;
    private Comparator<E> comp;   // default comparator

    /** Private class for the nodes.
     *  Has public fields so methods in BSTSet can access fields directly. 
     */
    private class BSTNode {

        // Data fields

        public E value;
        public BSTNode left = null;
        public BSTNode right = null;

        // Constructor

        public BSTNode(E v) {
            value = v;
        }

        //creates a method called contains so that i can call it later on for my find method
        public boolean contains(Object item) {
            return contains(item);//root.value.equals(item);
        }

        public int height() {
            return height();
        }

    }
    // Constructors - can either use a default comparator or provide one
    public BSTSet() {
        comp = new ComparableComparator();      // Declared below
    }

    public BSTSet(Comparator <E> c) {
        comp = c;
    }
}

これは私が完了しようとしているものです:

private class BSTSetIterator implements Iterator<E> {

    private Stack<BSTNode> stack = new Stack<BSTNode>();
    private BSTNode current = root;

    public BSTSetIterator(BSTNode root) {

         return new BSTSetIterator();

    }

    public boolean hasNext() {

        boolean hasNext = false;
        hasNext = !stack.isEmpty() || current != null;
        return hasNext;

    }

    public E next() {

        BSTNode next = null;

        while (current != null) {
            stack.push(current);
            current = current.left;
        }
        next = stack.pop();
        current = next.right;

        return next;

    }

    public void remove() {
        throw new UnsupportedOperationException();
    }
}
// Comparator for comparable 

private class ComparableComparator implements Comparator<E> {
    public int compare(E ob1, E ob2) {
        return ((Comparable)ob1).compareTo(ob2);
    }
}

これまでのところ、コードは と の行return new BSTSetIterator();で失敗していますreturn next;return next返すデータ型が間違っていると言っているからです。スタックを使用して BST を反復できるように、これらのメソッドを修正するにはどうすればよいですか?

4

1 に答える 1

2
BSTSetIterator();

コンストラクターがルートを予期していて、そのパラメーターを渡さなかったため、これは機能しません。'tree'というBSTSetオブジェクトがあり、新しいイテレータを作成する場合は、次の方法でイテレータを作成する必要があります。

BSTSetIterator iterator = new BSTSetIterator(tree.getRoot());

ただし、BSTSetクラスにゲッターがなく、ルートはプライベートです。心配しないでください。この問題の解決策は、BSTSetIteratorクラス内に次のようなパブリックゲッターを作成することです。

public BSTNode getRoot()
{
    return this.root;
}

コンストラクターは値を返しません。これは正しくありません。

 public BSTSetIterator(BSTNode root) {
         return new BSTSetIterator();
    }

代わりに、コンストラクターを次のように記述します。

public BSTSetIterator(BSTNode root)
{
    this.current = root;
}

また、rootが到達不能であるため、この定義は正しくありません。

private BSTNode current = root;

代わりにこれが必要です:

private BSTNode current;

あなたの他の問題に関しては、

BSTNode next = null;

'next'という変数がBSTNodeタイプであることを意味します。

public E next()

nextと呼ばれるメソッドがEタイプであることを意味します。EとBSTNodeは同じではないため、次のようになります。

return next;

間違っている。私はあなたにもっと助けを与えることができますが、あなたは今言語を学んでいることに気づきました。そうすればあなたはより速くなるので、あなた自身に技術とプログラミング一般を探求させる方が良いです。「人に魚を与えなさい、そうすればあなたは彼に一日餌をやる。人に釣り方を教えなさい、そしてあなたは彼に一生餌をやる。」

于 2012-10-08T22:41:42.943 に答える