Java 使用布尔方法为名称问题编写自己的类

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

我正在为大学写一门课,它所要做的就是把一个名字储存在首末和中间。它还必须有几个方法,其中一个是“publicbooleanequals(Name otherName)”

这是我到目前为止所拥有的

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方法来解决这个问题。我好像没法让它工作。我做错了什么\我能做什么不同的事

编辑:让我用书中的确切问题来澄清

  • 编写一个类名,用于存储一个人的名字、中间名和姓氏,并提供以下方法:
  • ·公共名称(字符串第一,字符串中间,字符串最后)-构造函数。名称应存储在给定的案例中;不要全部转换为大写或小写

    ·公共字符串getFirst()-返回第一个名称

    ·公共字符串getMiddle()-返回中间名

    ·公共字符串getLast()-返回姓氏

    ·public String firstMiddleLast()-按顺序返回包含此人全名的字符串,例如“Mary Jane Smith”

    ·public String lastFirstMiddle()-返回一个包含此人全名的字符串,姓氏后跟逗号,例如“Smith,Mary Jane”

    ·public boolean equals(Name otherName)-如果此名称与otherName相同,则返回true。比较不应区分大小写。(提示:有一个String方法的均衡器,就像字符串方法一样,但它不考虑做比较的情况。)< /P> < P> <代码>均衡器()>代码>是用于比较不是用于比较对象的字符串。 为了比较对象,您需要正确重写equals方法
    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,应该在他的任务中添加注释