簡體   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