.equals()方法检测重复的数组元素(试过@Override)

时间:2012-09-06 02:04:50

标签: java

我有一个简单的循环来检查任何重复的结果, 其中studresults保存我的结果,结果是给予方法的对象结果,r是数组中的当前对象。 我一直在整个程序中成功使用这个方法,虽然它在这种情况下不工作,即使我调试结果和r,完全相同,是否有人知道为什么这可能是?我已经按照其他答案的建议尝试了@Override无济于事。

我试图通过抛出异常来阻止重复的数组元素。

for(Result r : studresults)
   {
     if(r.equals(result)) 
       {
           return false;
       }
   }

编辑好在这里是整个班级>

package ams.model;

import java.util.ArrayList;
import java.util.Arrays;

import ams.model.exception.EnrollmentException;

public abstract class AbstractStudent implements Student {
private int studentId;
private String studentName;
private ArrayList<Course> studcourses = new ArrayList<Course>();
private ArrayList<Result> studresults = new ArrayList<Result>();


public AbstractStudent(int studentId, String studentName) {
    this.studentId = studentId;
    this.studentName = studentName;

}


public String getFullName() {


    return studentName;
}


public int getStudentId() {


    return studentId;
}


public Result[] getResults() {  

    Result[] res = studresults.toArray(new Result[0]);
    if(res.length > 0 )
    {
    return res;
    }
    return null;

}


public boolean addResult(Result result)
{
    for(Result r : studresults)
    {
        if(r.equals(result))
        {
                return false;
        }
    }

    studresults.add(result);
    return true;
}

public void enrollIntoCourse(Course c)
{
    //for re-enrollment
    if(studcourses.contains(c))
    {
        studcourses.remove(c);
        studresults.clear();
    }
    studcourses.add(c);
}

public void withdrawFromCourse(Course c) throws EnrollmentException
{
    if(studcourses.size() > 0)
    {
        studcourses.remove(c);
    }
    else
        throw new EnrollmentException();
}
public Course[] getCurrentEnrolment() 
{
    return studcourses.toArray(new Course[0]);
}


public abstract int calculateCurrentLoad();


public int calculateCareerPoints() {
    // TODO Auto-generated method stub
    return 0;
}

public String toString()
{
    return studentId + ":" + studentName +":" + calculateCurrentLoad();
}

}

2 个答案:

答案 0 :(得分:1)

您是否已在hashCode中覆盖Result方法? 如果覆盖equals,则还必须覆盖hashCode方法,以允许为类似对象(具有相同值但实际上具有不同对象实例的对象)返回相同的哈希码。

我认为hashcode的默认实现会为不同的对象实例返回不同的值,即使它们具有相同的值。

答案 1 :(得分:0)

相反,我转换为String然后进行比较,它的工作原理???

让我觉得之前有些不同寻常的事情?

新方法

public boolean addResult(Result r)
{
    for (Result s : studresults)
    {
         String sr1 = s.toString();
         String sr2 = r.toString();
         if(sr1.equals(sr2))
         {
             return false;
         }
    }