使用Equal方法覆盖CompareTo方法

4
我正在尝试读入一个公司向量,并返回true,如果两个公司具有相同的名称,则返回false。我使用CompareTo方法完成了这个过程。在我的方法中,将调用类Company中的“equals”方法。我的“equals”方法必须覆盖类Object中的相应方法。
我想知道是否可以使用Equal方法覆盖CompareTo。如果可以,我如何在main函数中检查它。
该程序的目标是检查向量中的2个公司,如果是,则返回true,否则返回false。下面是我在主函数中卡住的代码。
public class Company implements Comparable <Company> {

/**
 * @param args
 */
private String cName;



public String getName()
{
    return cName;
}

public int compareTo(Company b)
{
    if(this.cName == b.cName)
    {
        System.out.println(" from compareTo true");
        return 1;
    }

    else
    {
        System.out.println(" from compareTo false");
        return 0;
    }
}

public boolean equal(Object o)
{
    if (o instanceof Company)
    {
        Company c = (Company) o;
        if(this.cName.equals(c.cName))
        {
            System.out.println(" from equal true");
                return true;
        }
    }
    System.out.println(" from equal false");
    return false;
}

public static void main(String[] args) {
    // TODO Auto-generated method stub

    Vector<String> v = new Vector<String>();

    Company obj1 = new Company();
    Company obj2 = new Company();

    v.add("Rio tinto");
    v.add("BHP");
    v.add("BHP");
    v.add("CBA");

    Collections.sort(v);

    System.out.println(v);

}

代码有些混乱,请原谅,我只是尝试了不同的方法。

你似乎误解了compareTo()的工作原理。如果两个对象相等,应该返回0 - sverre
除了其他不好的事情,你正在使用“==”比较两个字符串。在正常情况下这是错误的,而你的例子可能符合“正常情况”的条件。 - Stephen C
3个回答

5
根据JavaDoc中的说明,compareTo方法的合同规定如下:
实现者还必须确保关系是可传递的:(x.compareTo(y)>0 && y.compareTo(z)>0)意味着x.compareTo(z)>0。
因此,对于你的问题的答案是——不行。在你的情况下:compare("A","B") == 1compare("B","A") == 1 这意味着"A"<"B""B"<"A",这自然是不正确的也不可传递的。
如果你想节省时间,可以实现compareTo并在equals中使用它。类似于这样:
public boolean equals(Object o)
{
    // ... Some stuff you need to complete here first
    return this.compareTo(o) == 0;
}

自然地,compareTo方法会期望一个Company对象 - 所以在将其发送到 compareTo之前,您需要进行验证。


2
我强烈反对这种方法。 compareTo 方法应返回一个整数,表示对象的相对顺序。合同规定(部分)a.compareTo(b) 返回 0 时,a.equals(b) 必须返回 true。但是,当 a.equals(b) 返回 false 时,a.compareTo(b)b.compareTo(a) 应该返回相反符号的非零整数。您的实现没有做到这一点。

@ Ted compareTo 用于比较自己类的对象,对吧?所以我想要做的是检查 cName 是否等于自己的名称对象。这样我就可以检查 Vector 中是否有任何相似的公司名称了。如果这不是实现检查 compareTo 的方式,你会怎么做呢? - Splitter
只需使用equals检查向量是否已经包含具有相同名称的公司; 它已经告诉你想要知道的信息。为什么要费力让compareToequals已经做好的工作呢? - Ted Hopp

0
首先,在编程中,使用“==”来检查对象的相等性是不可取的。应该用其他方法替代它。
if(this.cName.equals(b.cName)){

对于compareTo,您可以简单地返回字符串的compareTo。
public int compareTo(Company b)
{
    return this.cName.compareTo(b.cName);
}

说使用 == "永远不应该被做" 这种表述有些过了头。== 确实检查对象标识(identity),这往往与对象相等性(equality)不同。然而,它可以作为测试相等性的第一步(在测试对象是否与自身相等时,以避免更昂贵的测试),或者像使用Object.equals一样,作为完整定义相等性的方式。 - Ted Hopp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接