用Java实现Remove方法
我正在处理一些类的实现,但我似乎无法使其中的一部分正常工作。 我正在使用Junit检查我的实现是否正确,我只剩下一个错误需要纠正 这是我似乎无法正确理解的部分,正如描述中所述,我应该实现一个用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
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”“我并不是为他做所有的工作。”罗布注意编辑。