繁体   English   中英

方法“包含”.Java列表

[英]Method “contains”.Java List

我有Spring MVC应用程序。 我有实体课考试。 我重写方法eqauls所以我可以使用包含List接口的方法。 当我尝试添加新考试时,我看看是否已经添加了它。 但是当我通过考试对象到mathod包含时,我总是有不同的学生。 例如:我需要在Student Jone中添加考试。 我尝试添加它并获得另一个信息:Kate:Jone,而不是Jone:Jone。 我不知道为什么我会发生,因为当我将学生设为Jone时,我通过考试对象。

@Override
public boolean equals(Object arg) {
    Examination exam = (Examination) arg;

    System.out.println(exam.getStudent().getStudentFullName() + ":" + this.getStudent().getStudentFullName());

    if (!this.subject.getSubjectTitle().equals(exam.getSubject().getSubjectTitle()))
        return false;
    else 
        return true;
}

我尝试添加考试的一段代码

            examination.setStudent(currentStudent); // set student
            examination.setSubject(subjectExam); // set subject

            if(es.selectAllExams().contains(examination)) {
                return "error";
            } else {
                es.insertExam(examination); // add to database
                return "success";
            }

在equals方法中,您只比较标题,而不是学生姓名。 因此,如果您有两个相同标题的考试,但不同的学生名称相同(基于您的等于方法)。 比较equals方法的学生,你应该是好的。 通常,优先考虑覆盖equals和hashcode方法。

您的equals方法的实现通常不遵循覆盖equals方法的最佳实践。 谷歌有点“java equals方法最佳实践” - 你会发现这样的东西: http//javarevisited.blogspot.sk/2011/02/how-to-write-equals-method-in-java.html

如果你懒得编写自己的equals或hashcode方法(或者你有其他原因),你可以使用:

http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/builder/EqualsBuilder.html

要么

http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/HashCodeBuilder.html

你说你重写equals()

所以我可以使用包含List接口的方法

但是,你没有覆盖该方法使用contains() 有一个适合大多数用途的默认实现; 归结为“这些对象是同一个实例吗?”。 正如之前的响应者指出的那样,你的实现正在打破这种逻辑; 所有具有相同标题的考试都将被视为同一个对象,因此只要您的列表中有一个与您要添加的考试具有相同标题的考试,则contains()检查将始终返回true ,您将永远不能再添加另一个。

如果你想平等的基础上讨论的题目和学生,那么以前的答案是正确的-你要同时重写hashCode()equals() ,确保您认为重要的是要检查的身份在各个领域两种方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM