java 在自定义LinkedList的equals()方法中比较不同元素的最佳方法

bnl4lu3b  于 2023-05-05  发布在  Java
关注(0)|答案(1)|浏览(133)

在我下面的类中,我有两个字符串和一个equals方法用于我的自定义LinkedList。现在我知道如何在equals方法中比较不同的对象了,但是如果我想在程序中比较name,在比较number之前,我该如何在equals()方法中输入这个。下面我尝试了一个else if,但我知道这不会起作用,因为当我只想比较一个名字时,number会将自己与另一个数字进行比较,而在我的程序中,当我只想比较一个数字而不是一个名字时,如果这有意义的话。下面是我的类和我为我的equals方法所尝试的。任何帮助将不胜感激:)P.S抱歉类被称为Id我不太擅长堆栈溢出,无法让它显示在代码部分

private String number;
private String name;

public Id(){
    this.number = "";
    this.name = "";
    
    
}
    public Id(String number,String name){
        this.number = number;
        this.name = name;
    
}

public String getName(){
    
    return this.name;
}

public void setName(String name){
    this.name = name;
}
public String getNumber(){
    
    return this.number;
}

public void setNumber(String number){
    this.number = number;
}

@Override
public boolean equals(Object o){
     Id i = (Id)o;
if(this.number.equalsIgnoreCase(e.getNumber())){
    return true;

}else if(this.name.equalsIgnoreCase(e.getName()))
 return true;
else 
    return false;

'''

1tuwyuhd

1tuwyuhd1#

equals方法被破坏了。
1.它不应该扔。特别是,如果你试图问它:嘿,你和这个苹果平等吗,它应该回答“不”。您的代码将使用ClassCastException“回答”。
1.如果number等于另一个number,则代码将返回true;如果name等于另一个name,则返回。这是一个奇怪的定义。当然应该是:numbername应该相等。
1.不能只覆盖equals,必须始终覆盖equals * 和 * hashCode。如果你没有做到这一点,例如在HashMap中使用这个对象作为键会导致完全奇怪的行为,你添加的键似乎消失在空气中。
1.如果你想要一个只比较数字而不比较名字的equals方法,你可以这样做,你可以写任何你想要的。但是,equals方法必须是可交换的,结合的,并且坚持恒等式。换句话说,a.equals(a)必须为真,如果a.equals(b),则b.equals(a)必须为真,如果a.equals(b) && b.equals(c),则a.equals(c)必须为真。同样,如果你不遵守这些规则,编译器不会阻止你,但是各种类依赖于你的equals方法,如果它不这样做,它们会以奇怪的方式工作。
如果你的目标真的是:如果name匹配name**或number匹配number,则任何2个ID都相等-那么您的方法主要是这样做的,尽管类型转换是错误的,但您必须添加:

if (this == o) return true;
if (o == null) return false;
if (o.getClass() != this.getClass()) return false;
Id other = (Id) o;
// carry on comparing members here

相关问题