Java 搜索填充了特定ID的对象的ArrayList

Java 搜索填充了特定ID的对象的ArrayList,java,android,arraylist,Java,Android,Arraylist,我面临以下问题,这是一个测验(随机答案,不是每个问题的答案数量相同): 我有两个列表listOfAnswers和listofUnswers(都是typeList)。 答案定义如下: public class Answer { int answerId; int answerIsCorrect; String answer; public Answer() { } public void setId(int id) {

我面临以下问题,这是一个测验(随机答案,不是每个问题的答案数量相同):

我有两个列表
listOfAnswers
listofUnswers
(都是type
List
)。
答案
定义如下:

public class Answer {

    int     answerId;
    int     answerIsCorrect;
    String  answer;

    public Answer() {

    }

    public void setId(int id) {
        this.answerId = id;
    }

    public Answer setAnswer(String answer) {
        this.answer = answer;

        return this;
    }

    public void setAnswerIsCorrect(int answerIsCorrect) {
        this.answerIsCorrect = answerIsCorrect;
    }

    public int getId() {
        return this.answerId;
    }

    public String getAnswer() {
        return this.answer;
    }

    public int getAnswerIsCorrect() {
        return this.answerIsCorrect;
    }

    public String toString() {
        return String.format("Answer[%s, %s, %s]", this.answerId, this.answerIsCorrect, this.answer);
    }

}
listOfAnswers
对象保存每个问题的每个答案(在
listOfAnswers
类型的
listOfAnswers
中指定,但这不是问题所在)。
listOfUserAnswers
对象保存用户选择的每个答案(通过复选框选择)。此时,应用程序不知道用户选择的答案是对还是错

现在,在计算结果时,我希望遍历
listOfAnswers
,并检查answerId(
listOfAnswers.get(I).getId()
)是否在
listofUnswers
中也可用

但是这是如何工作的呢?我想,我无法查看包含(…)的在线解答列表。还是我错了


如果您在理解上有困难,请发表评论。…

您无法检查
在线解答列表是否包含()
,因为您尚未定义
答案.equals()
方法。您必须像这样迭代两个列表:

for(Answer answer : listOfAnswers) {
    for(Answer userAnswer : listOfUserAnswers) {
        if(answer.getId() == userAnswer.getId()) {
            //answer matches
        }
    }
}
或者,您可以定义
Answer.equals()
方法:

@Override
public boolean equals(Object obj) {
    return obj instanceof Answer && ((Answer)obj).answerId == this.answerId;
}
现在,您可以执行以下操作,而不是嵌套循环:

for(Answer answer : listOfAnswers) {
    if(listOfUserAnswers.contains(answer) {
        //answer matches
    }
}
编辑:如注释中所述,在重写
equals()
时,应始终重写
hashCode()
。在这种情况下,最简单的实现是:

@Override
public int hashCode() {
    return answerId;
}

由于尚未定义
Answer.equals()。您必须像这样迭代两个列表:

for(Answer answer : listOfAnswers) {
    for(Answer userAnswer : listOfUserAnswers) {
        if(answer.getId() == userAnswer.getId()) {
            //answer matches
        }
    }
}
或者,您可以定义
Answer.equals()
方法:

@Override
public boolean equals(Object obj) {
    return obj instanceof Answer && ((Answer)obj).answerId == this.answerId;
}
现在,您可以执行以下操作,而不是嵌套循环:

for(Answer answer : listOfAnswers) {
    if(listOfUserAnswers.contains(answer) {
        //answer matches
    }
}
编辑:如注释中所述,在重写
equals()
时,应始终重写
hashCode()
。在这种情况下,最简单的实现是:

@Override
public int hashCode() {
    return answerId;
}

您可以按如下方式覆盖equals方法:

public boolean equals(Object o) {
          if(!(o instanceof Answer) ) return false;
          return answerId == ((Answer)o).answerId;
    }

和调用包含。

您可以只覆盖equals方法,如下所示:

public boolean equals(Object o) {
          if(!(o instanceof Answer) ) return false;
          return answerId == ((Answer)o).answerId;
    }

并调用contains。

要使用ArrayList.contains()方法,您需要重写Object.equals()方法。因此,在本例中,您需要在答案类中添加以下内容:

public boolean equals(Object o){
    if(o instanceof answer){
        return this.answerId == ((Answer) o).answerId;
    } else return false;
}

然后可以使用它。

要使用ArrayList.contains()方法,需要重写Object.equals()方法。因此,在本例中,您需要在答案类中添加以下内容:

public boolean equals(Object o){
    if(o instanceof answer){
        return this.answerId == ((Answer) o).answerId;
    } else return false;
}

然后您就可以使用它了。

除非您重写以下方法,否则无法检查
listOfUserAnswers.contains()

@override    
public boolean equals(Object o){
       if(this.answerId == ((Answer)o).answerId ) return true;
       return false;
}

除非重写以下方法,否则无法检查
listOfUserAnswers.contains()

@override    
public boolean equals(Object o){
       if(this.answerId == ((Answer)o).answerId ) return true;
       return false;
}

如果查看Javadoc for列表,它包含方法Object.equals()。通常默认情况下,这会比较对象ID/地址。你需要根据你的情况改变这一点。抱歉,这是家庭作业,我不会为您回答这个问题:)如果您查看Javadoc for List,它包含方法Object.equals()。通常默认情况下,这会比较对象ID/地址。你需要根据你的情况改变这一点。对不起,这是作业,我不打算为你回答这个问题:)这不安全;您需要检查
的instanceof
。这是不安全的;您需要检查
instanceof
。应覆盖
hashCode
以返回
answerId
应覆盖
hashCode
以返回
answerId