我面临以下问题,这是一个测验(改组答案,每个问题的答案数量不一样):
我有两个列表listOfAnswers
和listOfUserAnswers
(两者都是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}}。或者我错了吗?
如果您无法理解,请评论....
答案 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;
}