1

私はいくつかのクラスの実装に取り​​組んでいますが、その一部が機能していないようです。Junit実装が正しいかどうかを確認するために使用していますが、修正するエラーが1つしかありません。

これは、説明に記載されているように、removeメソッドを実装することになっているように、正しくないように見える部分ですが、私が知る限り、実際には削除されませんx

/**
 * Removes the specified element from this set if it is present. 
 * post: x is removed if it was present
 * @param x the element to remove - if present
 * @return true if the set contained the specified element
 */
public boolean remove(Object x) {
    return false;
}

これが私の現在のコードです:

public boolean remove(Object x) {
    if(super.remove(x)){
        if( maxElement == x ){ 
            updateMax();
        }
        return true;
    }
    return false;
}

private void updateMax() {
    E newMax = set.get(0);
    for ( E x : set){
        if (x.compareTo(newMax) > 0) {
            newMax = x;
        }
    }
    maxElement = newMax;
}

しかし、意図したとおりに機能しません。

このクラスを別のクラスから実装しているため、super を使用しています。また、同じ削除部分を持つ他のクラスは、同じコード スニペットで動作しました。

すべてのソースコードは次のとおりです。

私が実装しようとしている MaxSet クラス:

package set;

import java.util.NoSuchElementException;

public class MaxSet<E extends Comparable<E>> extends ArraySet<E> {
private E maxElement;


public MaxSet() {
    super();
}


public E getMax() {
    if (isEmpty()) {
        throw new NoSuchElementException();
    }
    return maxElement;
}


public boolean add(E x) {
    if (isEmpty()) {
        maxElement = x;
    } else if (x.compareTo(maxElement) > 0) {
        maxElement = x;
    }
    return super.add(x);
}


public boolean remove(Object x) {
        if(set.contains(x)){
            set.remove(x);
            return remove(x); // true if the set contained the specified element
        }
        return super.remove(x);
    }


public boolean addAll(SimpleSet<? extends E> c) {
    return super.addAll(c);
}
}

ArraySet 親クラス:

package set;
import java.util.ArrayList;
import java.util.Iterator;


public class ArraySet<E> implements SimpleSet<E> {
protected ArrayList<E> set;

public ArraySet() {
    set = new ArrayList<E>();
}

public boolean add(E x) {
    if(!set.contains(x)) {
        return set.add(x);
    }
    return false;

}

public boolean remove(Object x) {   
    if(set.contains(x)){ 
        return set.remove(x);
    }
    return false; //?
}

public boolean contains(Object x) { 
    if(set.contains(x)){
        return true;
    }
    return false;
}

public boolean isEmpty() {
    if(set.isEmpty()){
        return true;
    }
    return false;
}

public int size() {
    return set.size();
}

public Iterator<E> iterator() {
    return set.iterator();
}

public boolean addAll(SimpleSet<? extends E> s) {
    Iterator<? extends E> it = s.iterator();
    boolean changed = false;
    while (it.hasNext()) {
        changed = changed || add(it.next());
    }
    return changed;
}

}

4

3 に答える 3

2

あなたは本当に元気です。削除時に「最大」変数をデクリメント/更新しないというタイプミスです。そのため、「間違った最大値」assertionError を取得しています。

于 2013-01-31T17:17:51.080 に答える
2

私は次のようなものに行きます:

public boolean remove(Object x) {
    if(super.remove(x)){
        if( maxElement == x ){ /* find new maxElement here */ }
        return true;
    }
    return false;
}
于 2013-01-31T17:19:40.400 に答える
1

あなたのロジックに問題があると思います。これを試してみてください

public boolean remove(Object x) {
    if(set.contains(x)){
        set.remove(x);
        return true; // true if the set contained the specified element
    }
    return super.remove(x);
}
于 2013-01-31T17:01:19.737 に答える