0

重複した結果をチェックする単純なループがあります。ここで、Studresults は結果を保持し、結果はメソッドに渡されたオブジェクトの結果であり、r は配列の現在のオブジェクトです。私はプログラム全体でこのメソッドを正常に使用してきましたが、この場合は機能していませんが、結果と r をデバッグするときはまったく同じですが、これがなぜなのか誰にもわかりませんか? 他の回答で示唆されているように、私はすでに @Override を試しましたが、役に立ちませんでした。

例外をスローして、重複する配列要素を停止しようとしています。

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

編集 OK ここにクラス全体があります>

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();
}

}

4

2 に答える 2

1

hashCodeのメソッドを既にオーバーライドしていますResultか?
をオーバーライドequalsする場合は、hashCodeメソッドもオーバーライドして、同様のオブジェクト (同じ値を持つが実際には異なるオブジェクト インスタンス) に対して同じハッシュコードを返せるようにする必要があります。

ハッシュコードのデフォルトの実装は、同じ値を持っていても、異なるオブジェクト インスタンスに対して異なる値を返すと思います。

于 2012-09-06T02:12:13.903 に答える
0

代わりに、 toString に変換して比較したところ、うまくいきましたか???

以前は少し変わったものがあったと思いますか?

新しい方法

public boolean addResult(Result r)
{
    for (Result s : studresults)
    {
         String sr1 = s.toString();
         String sr2 = r.toString();
         if(sr1.equals(sr2))
         {
             return false;
         }
    }   
于 2012-09-06T07:06:15.233 に答える