搜索ArrayList填充特定ID的对象

时间:2014-06-09 18:19:19

标签: java android arraylist

我面临以下问题,这是一个测验(改组答案,每个问题的答案数量不一样):

我有两个列表listOfAnswerslistOfUserAnswers(两者都是List<Answer>类型)。 Answer定义如下:

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对象包含每个问题的每个答案(在listOfQuestions类型的List<Question>中指定,但这不是问题)。 listOfUserAnswers对象包含每个答案,用户具有SELECTED(由复选框选择)。此时,应用程序不知道用户选择的答案是对还是错。

现在,在计算结果时,我希望迭代listOfAnswers并检查,如果answer listOfAnswers.get(i).getId()中的answerId(listOfUserAnswers)也可用。listOfUserAnswers.contains(...)

但这是如何运作的?我想,我无法查看{{1}}。或者我错了吗?

如果您无法理解,请评论....

4 个答案:

答案 0 :(得分:3)

您无法检查是否listOfUserAnswers.contains(),因为您尚未定义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
    }
}

编辑:正如评论中所述,覆盖hashCode()时,您应始终覆盖equals()。在这种情况下,最简单的实现是:

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

答案 1 :(得分:1)

要使用ArrayList.contains()方法,您需要覆盖Object.equals()方法。因此,在这种情况下,您可以在答案课中添加以下内容:

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

然后你可以使用它。

答案 2 :(得分:0)

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

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

并致电包含。

答案 3 :(得分:0)

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

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