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;
    }

}

// Constructors - can either use a default comparator or provide one

public BSTSet() {
    comp = new ComparableComparator();      // Declared below
}

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

// Methods

/** Return true iff the set is empty */
public boolean isEmpty() {
    return count == 0;
}

/** Return the number of elements in set */

public int size() {
    return count;
}

これは私が修正しようとしている方法です:

 /** Return true iff (if and only if) the set contains an item
 * (the item must be non null) 
 */
public boolean contains(Object item) {
    // YOUR CODE HERE

    //changes item to E so it can be used in the comparator
    E value1 = (E) item;

    if (root.value.equals(item)){
        return true;
    }

    int s = comp.compare(value1,root.value);
    if(s<0){
        if (root.left == null)
            return false;
        else
            return root.left.contains(item);
    }
    else if(s>0){
        if (root.right == null)
            return false;
        else
            return root.right.contains(item);
    }

}

これまでのところ、すべてうまくいっているように見えますが、return root.left.contains(item); で失敗します。そして、シンボルが見つからないと言います-メソッドには含まれています。値が BST にあるかどうかを返す必要がある、contains メソッドを実行できるようにするにはどうすればよいですか?

4

1 に答える 1

2

leftとの両方がインスタンス rightとして宣言されています。には というメソッドがないため、追加する必要があります。BSTNodeBSTNodecontains

public boolean contains(Object item) {
    return value.equals(item);
}

理想的には、ノードとセットの両方で同じインターフェイスを実装する必要があるため、実際に呼び出している実装がわかりません。

于 2012-10-08T12:28:43.987 に答える