Java-检查HashMap的值是否正确复制到ArrayList的测试返回false

Java-检查HashMap的值是否正确复制到ArrayList的测试返回false,java,Java,我应该写一个方法,以列表的形式返回HashMap的所有值 对于上下文,以下是我正在使用的类。课堂问题是一个类似测验的多项选择题,其多个答案映射在HashMap中,键值为(a),b),c),等等 类Answer具有以下接口: public class Answer{ private String answerText= ""; private boolean correct; public Answer(String answerText, boole

我应该写一个方法,以列表的形式返回HashMap的所有值

对于上下文,以下是我正在使用的类。课堂问题是一个类似测验的多项选择题,其多个答案映射在HashMap中,键值为(a),b),c),等等

Answer
具有以下接口:

public class Answer{
    private String answerText= "";
    private boolean correct;

    public Answer(String answerText, boolean correct) {
      this.correct = correct;
      this.answerText = answerText;
    }
...
public class Question{
    private String text;
    private double points;
    private HashMap<String, Answer> answers= new HashMap<> ();

    public void addAnswer(String id, String text, boolean correct)
       answers.put(id, new Answer(text, correct));
   }
...
问题
具有以下界面:

public class Answer{
    private String answerText= "";
    private boolean correct;

    public Answer(String answerText, boolean correct) {
      this.correct = correct;
      this.answerText = answerText;
    }
...
public class Question{
    private String text;
    private double points;
    private HashMap<String, Answer> answers= new HashMap<> ();

    public void addAnswer(String id, String text, boolean correct)
       answers.put(id, new Answer(text, correct));
   }
...
下面是我写的实际方法:

 public List<Answer> getListAnswers() {

        ArrayList<Answer> list = new ArrayList<>();

        for(Map.Entry<String, Answer> map : answers.entrySet()) {
            Answer o =  map.getValue();
            list.add(o);
        }
        return list;
    }
公共列表getListAnswers(){
ArrayList=新建ArrayList();
for(Map.Entry映射:answers.entrySet()){
答案o=map.getValue();
列表。添加(o);
}
退货清单;
}
我尝试的

我编写了一个简单的方法,它使用for循环遍历集合,并将HashMap的每个值简单地添加到ArrayList中

但是,测试失败。

您的方法听起来不错。 然而,测试断言确实如此

assertTrue(answers.contains(new Answer("first answer", true))
在列表中,javadocs将以下内容写入contains方法

如果此列表包含指定的元素,则返回true。更多 形式上,当且仅当此列表至少包含一个 元素e使得(o==null?e==null:o.equals(e))

因为它们创建了一个新的Answer实例,并且Answer中没有equals实现,所以调用了来自基本对象类的equals。这将返回false,因为basic equals方法比较引用

类对象的equals方法实现了对象上最有区别的等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象(x==y的值为true)时,此方法才返回true

如果您在应答中实现并覆盖equals(和hashCode)方法来比较answerTextcorrect,则测试应该通过

一个快速的equals(由intellij IDEA生成)可能看起来像

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof Answer)) return false;
    Answer that = (Answer) o;
    return correct == that.correct &&
            answerText.equals(that.answerText);
}

你的
Answer
类是否实现了
equals
hashCode
@user7可能有什么发现。。。断言检查答案列表是否包含新答案。这将失败,因为它们是不同的实例!我实现了
equals
hashCode
,测试结果出乎意料地(对我来说)为真。@l0ner9检查我的答案,也许这澄清了测试通过的原因