Java 使用布尔方法为名称问题编写自己的类
我正在为大学写一门课,它所要做的就是把一个名字储存在首末和中间。它还必须有几个方法,其中一个是“publicbooleanequals(Name otherName)” 这是我到目前为止所拥有的Java 使用布尔方法为名称问题编写自己的类,java,class,methods,Java,Class,Methods,我正在为大学写一门课,它所要做的就是把一个名字储存在首末和中间。它还必须有几个方法,其中一个是“publicbooleanequals(Name otherName)” 这是我到目前为止所拥有的 public class Name { private String FirstNM, MiddleNM, LastNM,Name, otherName; public Name(String first, String middle, String last) { FirstNM = f
public class Name
{
private String FirstNM, MiddleNM, LastNM,Name, otherName;
public Name(String first, String middle, String last)
{
FirstNM = first;
MiddleNM = middle;
LastNM = last;
Name = first+middle+last;
}
public String toString()
{
return (FirstNM+", "+MiddleNM+", "+LastNM);
}
public String getFirst()
{
return FirstNM;
}
public String getMiddle()
{
return MiddleNM;
}
public String getLast()
{
return LastNM;
}
public String firstMiddleLast()
{
return (FirstNM+", "+MiddleNM+", "+LastNM);
}
public String lastFirstMiddle()
{
return (LastNM+", "+FirstNM+", "+MiddleNM);
}
public boolean equals(Name otherName)
{
if (otherName.equalsIgnoreCase(Name))
{
return true;
}
}
我在比较一个名称对象与另一个名称对象时遇到问题。这个问题希望我使用equalsIgnoreCase方法来解决这个问题。我好像没法让它工作。我做错了什么\我能做什么不同的事
编辑:让我用书中的确切问题来澄清
equals()
将根据需要的属性比较对象的相等性,并且hashCode()
是必需的,以便在集合中正确使用对象
这是java.lang.Object类中equals的默认实现
public boolean equals(Object obj) {
return (this == obj);
}
equalsIgnoreCase
是一个必须在String对象上调用的Java字符串方法。您试图在Name对象上调用此方法,但该方法无效。必须调用Name类中的helper方法来检索正确的字符串,然后调用equalsIgnoreCase
方法
这里有两种方法可以分别比较整个名称字符串和名称的三个部分
public boolean equals(Name otherName)
{
return (otherName.getFirst().equalsIgnoreCase(Name.getFirst())
&& otherName.getMiddle().equalsIgnoreCase(Name.getMiddle())
&& otherName.getLast().equalsIgnoreCase(Name.getLast()));
}
此外,通过使用您提供的字符串方法,您可以获得更干净的代码
public boolean equals(Name otherName)
{
return (otherName.toString().equalsIgnoreCase(Name.toString()));
}
在equals
方法中要做的是比较类中的所有重要变量。要开始,请执行以下操作:
public boolean equals(Name otherName) {
return (this.firstNm.equalsIgnoreCase(otherName.firstNm) && /* rest of variables to compare */)
}
从技术上讲,这应该是接收一个对象
并将其投射,但如果你的老师说要接收名称
,那么我想就这样做吧
覆盖等于应该看起来更像这样:
public boolean equals(Object other) {
if (other == null || ! other instanceof Name) return false;
Name otherName = (Name) other;
return (this.firstNm.equalsIgnoreCase(otherName.firstNm) && /* rest of variables to compare */)
}
比较或创建getName()方法时,只需使用全名字符串,而不是名称。至少要这样做:
public boolean equals(Name otherName)
{
String fullName = otherName.getFirst() + otherName.getMiddle() + otherName.getLast();
if (fullName.get.equalsIgnoreCase(this.Name))
{
return true;
}
return false;
}
明显的问题是equals
不会在所有路径中返回值-特别是如果它们的值不相等,则不会返回false
。另一个明显的问题是,要正确覆盖equals,需要比较对象并在必要时强制转换为字符串。这个equals
方法有什么用例?它不会覆盖Object#equals
,因此在ArrayList#contains
等数据结构中无法获得正确的功能。我想确定您实际上需要一个将名称
作为正式参数的方法,你能详细解释一下你的意思吗?我还没有运行任何程序,因为eclipse正在突出显示equalsIgnoreCase,并且我假设如果我尝试使用该方法,我会得到一个错误。为什么你还在紧接着用return
表达式进行if检查?只需返回布尔表达式……Eclipse将突出显示equalsIgnoreCase,因为您试图在非字符串对象上调用string方法。请参阅上面提供的我的代码。如果这能解决您的问题,请告诉我。此外,您应该真正了解如何调试代码。谷歌“eclipse调试”。这是一个非常有用的工具,你应该熟悉它。第二组代码确实解决了我的问题。谢谢你的帮助。我仍在学习,我更专注于完成任务,而不是正确格式化任务。我也会接受你的谷歌建议。为什么这会被否决?我做错了什么?我宁愿有人在我的答案中解释错误,而不是在没有解释的情况下盲目地否决投票。你想覆盖equals
方法。这意味着otherName
是一个对象
。你还需要检查null
@Makoto我意识到了这一点,但他给了我们他应该遵守的规则。我在编辑中添加了这些信息。我想说的是不要抛出一个IllegalArgumentException
;如果为null或不是实例,只需返回false
。否则,这个答案很好。@Makoto我想在给出建议时,答案不应该仅仅是“什么会起作用”,还应该告诉他们应该如何做。到底是谁否决了我的答案?看在上帝的份上,这哪里错了?如果不是最后一部分,我会投赞成票。它与你的答案无关,应该是一个注释。你有两个助手方法,可以一次性提供你所关心的所有字段。为什么不使用它们呢?另外,为什么返回true
,而返回false
在它之外?只需返回布尔比较。@Quilliom agree,应该在他的任务中添加注释