用Java实现Remove方法

用Java实现Remove方法,java,object,junit,arraylist,Java,Object,Junit,Arraylist,我正在处理一些类的实现,但我似乎无法使其中的一部分正常工作。 我正在使用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 el

我正在处理一些类的实现,但我似乎无法使其中的一部分正常工作。 我正在使用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);
}
}
包集;
导入java.util.NoSuchElementException;
公共类MaxSet扩展了ArraySet{
私有E极大元;
公共最大集(){
超级();
}
公共E getMax(){
if(isEmpty()){
抛出新的NoTouchElementException();
}
返回最大元素;
}
公共布尔加法(E x){
if(isEmpty()){
maxElement=x;
}如果(x.compareTo(maxElement)>0,则为else{
maxElement=x;
}
返回super.add(x);
}
公共布尔删除(对象x){
if(集合包含(x)){
设置。移除(x);
返回remove(x);//如果集合包含指定元素,则返回true
}
返回super.remove(x);
}

public boolean addAll(SimpleSet我认为您的逻辑有问题,试试这个

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

我觉得你的逻辑有问题,试试这个

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

实际上你很好。只是一个在删除时没有减少/更新“max”变量的输入错误。这就是为什么你得到了“错误的max值”断言错误。

你实际上很好。只是一个在删除时没有减少/更新“max”变量的输入错误。这就是为什么你得到了“错误的max值”断言错误。

我会选择这样的东西:

public boolean remove(Object x) {
    if(super.remove(x)){
        if( maxElement == x ){ /* find new maxElement here */ }
        return true;
    }
    return false;
}

我会选择这样的方式:

public boolean remove(Object x) {
    if(super.remove(x)){
        if( maxElement == x ){ /* find new maxElement here */ }
        return true;
    }
    return false;
}



请不要链接到pastebin,而不要在您的问题中包含源代码。pastebin链接不会永远持续,这意味着当它们过期时,此问题将丢失所有上下文。不想让太多代码变得杂乱无章,我是否应该将所有内容都发布到此处?它将始终返回false,对吗?啊,Abu破坏了它。@Rob post here。您不是吗试图在父项的“设置”字段后返回结果?如果是,则可能两次删除同一元素,这就是为什么在第二次删除时它给出false。@Rob,看看父项的JavaDoc。它是同一个契约。那么为什么要覆盖它?请不要链接到pastebin,而不要在问题中包含源。Pastebin链接不会永远存在,这意味着当它们过期时,这个问题会丢失所有上下文。不想让太多的代码变得混乱,我应该在这里发布所有内容吗?它将始终返回false,对吗?啊,阿布破坏了它。@Rob post here。你是否尝试在if之后返回结果?你的“set”字段是否来自父字段?如果是,y您可能删除了同一个元素两次,这就是为什么第二次它给出false。@Rob,看看父级的JavaDoc。它是同一个契约。那么为什么要覆盖它呢?它给出了错误:java.lang.AssertionError:max的错误值:预期值:但是:@Rob您自己没有针对remove方法的测试吗?是的,它正在检查其中8项和2项出现故障(testMaxAfterMaxremove)和(testMaxAfterManyMaxremoves)@Rob我现在明白了。如果删除的对象是你的MaxElement,你必须在remove中更改你的MaxElement。它给了我一个错误:java.lang.AssertionError:max的值错误:预期值:但是:@Rob你没有单独测试remove方法吗?是的,它正在检查8项,其中2项给出失败(testMaxAfterMaxremove)和(testMaxAfterManyMaxremoves)@Rob我现在明白了。如果删除的对象是您的MaxElement,您必须在remove中更改您的MaxElement。哦,等等,我还以为您做了此编辑:if(set.contains(x)){return set.remove(x);//如果集合包含指定的元素,则为true}父类已经做了这种逻辑。所以在这两种情况下都是代码味道。事实上,我认为超类中的
set
应该是私有的,以防止这种情况发生。是的,但我不是在判断代码…只是帮助他指出真正的问题,即为什么最初他的一个测试失败。我是第二个pst.如果你问我,直接触摸
set
是导致测试失败的问题的一部分。哦,等等,我还以为你做了这个编辑:if(set.contains(x)){return set.remove(x);//如果集合包含指定的元素,则为true}父类已经做了这种逻辑。所以在这两种情况下都是代码味道。事实上,我认为超类中的
set
应该是私有的,以防止这种情况发生。是的,但我不是在判断代码…只是帮助他指出真正的问题,即为什么最初他的一个测试失败。我是第二个pst.如果你问我,直接触摸
set
是导致测试失败的问题的一部分。这只会给他同样的“最大值错误”错误。我认为它需要更新为fdusosaid@Michael这就是为什么我写了“在这里查找新的maxElement”…我没有为他做所有的工作。@Rob注意编辑…我错误地设置了
。在第一个版本中删除了
。如果您发布了如何实现“查找新的maxElement”我相信我们可以进一步帮助您。我试着做一个foreach循环,但没有那么好。@Rob您能用代码更新您的问题吗?我想这是个小问题。这只会给他同样的“最大值错误”错误。我想它需要更新为fdusosaid@Michael这就是为什么我写了“在这里查找新的maxElement”“我并不是为他做所有的工作。”罗布注意编辑。