1

我正在处理一些类的实现,但我似乎无法让它的一部分工作。我Junit用来检查我的实现是否正确,我只剩下一个错误需要纠正。

这是我似乎无法正确处理的部分,如描述中所述,我应该实现一个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

你其实很好。只是一个错字,您不会在删除时减少/更新您的“max”变量。这就是为什么你得到“错误的最大值”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 回答