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
(都是typeList
)。
答案
定义如下:
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