【问题标题】:Overriding CompareTo using Equal method使用 Equal 方法覆盖 CompareTo
【发布时间】:2011-08-23 19:34:14
【问题描述】:

我正在尝试读取公司向量,如果两家公司名称相同,则返回 true,否则返回 false 我使用 ComapareTo 方法完成的。在我的方法中,它将调用 Company 类中的“equals”方法。我的“equals”方法必须覆盖 Object 类中的相应方法。

我想知道的是是否可以使用 Equal 方法覆盖 CompareTo。如果是这样,我该如何在 main 中检查它。

该程序的目标是检查向量中的 2 家公司,如果是则返回 true,否则返回 false。这是我在 main 中测试它的代码。

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
  • 除了其他不好的事情之外,您正在使用== 比较两个字符串。在正常情况下这是错误的,您的示例可能符合“正常情况”。

标签: java


【解决方案1】:

我强烈建议不要使用这种方法。 compareTo 方法应返回一个整数,指示对象的相对顺序。合同规定(部分)a.compareTo(b)a.equals(b) 返回true 时返回0。但是,当a.equals(b) 返回false 时,a.compareTo(b)b.compareTo(a) 应该返回非零整数相反符号。您的实现没有这样做。

【讨论】:

  • @Ted compareTo 是用来和自己的类对象比较的吧?所以我要做的是检查 cName 是否等于自己的名称对象。这样我可以检查 Vector 是否有任何微笑公司名称。如果这不是检查 compareTo 的实施方式,你会怎么做?
  • 只要用equals检查vector是否已经包含同名公司即可;它已经告诉你你想知道什么。为什么要让compareTo 完成equals 已经完成的工作?
【解决方案2】:

compareTo 根据JavaDoc 的合同表明:

实现者还必须确保关系是传递的: (x.compareTo(y)>0 && > y.compareTo(z)>0) 意味着 x.compareTo(z)>0 .

所以你的问题的答案是 - 不,你不能。在你的情况下: compare("A","B") == 1compare("B","A") == 1 这意味着 "A"&lt;"B""B"&lt;"A" 自然不是真的也不是传递的。

如果您想节省时间 - 实现 compareTo 并在 equals 中使用它。 像这样:

public boolean equals(Object o)
{
    // ... Some stuff you need to complete here first
    return this.compareTo(o) == 0;
}

compareTo 自然会期望Company 类型的对象 - 因此您必须在将其发送到compareTo 之前验证这一点

【讨论】:

    【解决方案3】:

    首先不应该使用 == 来检查对象的相等性;替换为

    if(this.cName.equals(b.cName)){
    

    对于 compareTo,您可以简单地返回字符串的 compareTo

    public int compareTo(Company b)
    {
        return this.cName.compareTo(b.cName);
    }
    

    【讨论】:

    • 说使用==“不应该做”有点过分了。 == 确实检查对象 identity,这通常与对象 equality 不同。但是,它可以是相等性测试的第一步(在针对自身进行测试的对象的情况下缩短更昂贵的测试)或(如Object.equals)作为相等性的完整定义。
    猜你喜欢
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多