0

这是我到目前为止所拥有的,包括测试课我只是不确定如何比较两个团队这是作业......团队只有一个属性,球队名称(例如巴塞罗那)

包括以下这些:

  • 构造函数

  • 获取器/评估器方法

  • 修改器/设置器方法

  • toString 方法

  • 等于方法

班组

public class Team {

private String name;

public Team(String name) { // Constructor

    this.name = name;
}

public void setName(String name) { // The Setter set's the name

    this.name = name;
}

public String getName() { // The Getter get's the the name

    return name;
}

@Override
public String toString() { // This returns a String object

    return "The team name is " + name;
}

@Override
public boolean equals(Object o) {

    if (o instanceof Team) {

        Team t = (Team) o;

        if (t.getName().equalsIgnoreCase(getName())) { //I'm not sure what i'm missing here

            return true;
        }

        else {
            return false;

        }

    }

    else {

        return false;
    }
}

}

测试班

public class TeamMain {
public static void main(String[] args) {

    Team team = new Team("ManUnited");

    Team team2 = new Team("ManCity");
    System.out.println(team.equals("ManUnited"));

    System.out.println(team2.equals("ManCity"));

    System.out.println(team.getName());
    team.setName("ManCity");
    System.out.println(team.toString());
}

}
4

3 回答 3

1

您在询问团队是否等于恰好包含字母“ManUnited”的字符串,它们不一样,因为字符串不是团队。

System.out.println(team.equals("ManUnited"));

team是一个Team,包含一个String,“ManUnited”实际上是一个String

您的 equals 方法的正确测试是

   Team team = new Team("ManUnited");
   Team team2 = new Team("ManCity");
   Team team3 = new Team("ManUnited");

   System.out.println(team.equals("team2")); //prints false
   System.out.println(team.equals("team3")); //prints true

哪个正确评估了相等性(但是请注意下面的哈希码问题)

哈希码

此外(但不是问题的直接原因)您在.equals()不覆盖方法的情况下覆盖了.hashCode()方法,这可能会导致类/方法出现意外行为,这些类/方法使用哈希码作为评估相等性的捷径(例如 HashSet)。一个好的 IDE 会(提示)为您覆盖 HashCode。

hashcode 是一个函数,它返回一个整数,保证相等的对象相等,而不相等的对象相对不太可能相等。在非覆盖状态下,equals() 和 hashCode() 都评估与实际上是相同对象的对象的相等性。您已经(非常合法地)更改了 equals 方法以将“看起来相同”的对象视为相等,但哈希码仍在查看对象是否实际上相同;因此意外行为

于 2013-10-09T18:42:04.757 回答
1

在这一行:

System.out.println(team.equals("ManUnited"));

您正在将 yourTeam与 a进行比较String,因此您的代码正确返回false,因为 youro不是Team. 与 aTeam相比:

System.out.println(team.equals(new Team("ManUnited")));
于 2013-10-09T18:40:57.187 回答
1

第 9 条:当你覆盖 equals 时,总是覆盖 hashCode

错误的常见来源是未能覆盖 hashCode 方法。您必须在每个覆盖 equals 的类中覆盖 hashCode。否则将导致违反 Object.hashCode 的一般合同,

有效的 Java,第 2 版。

正如@rgettman 所指出的,您应该将团队与团队进行比较,而不是将团队与字符串进行比较。否则你的代码将返回 false。

System.out.println(team.equals("ManUnited")) // 他们不一样

public boolean equals(Object o) {

    if (o instanceof Team) {

        Team t = (Team) o;

        if (t.getName().equalsIgnoreCase(getName())) { //I'm not sure what i'm missing here

            return true;
    }

        else {
            return false;

        }

   } else {

    return false; // team.equals("ManUnited") will return false, since string is not instance of Team.
}
于 2013-10-09T18:43:46.537 回答