Java使用TreeSet存储Esame对象遍历时仅打印1条记录问题排查
问题原因
你遇到的问题根源是Esame类的compareTo方法实现不符合TreeSet的使用规则:
TreeSet基于排序逻辑判断元素是否重复,只要两个对象调用compareTo返回值为0,就会被判定为重复元素,无法存入集合- 你当前的
compareTo方法硬编码返回0,导致所有后续添加的Esame实例都会被判定为和第一个存入的实例重复,因此集合中永远只会保留第一条考试记录,遍历自然只能输出1条内容。
修复方案
修改Esame类的compareTo方法,匹配你预设的「考试编码相同则视为同一考试」的规则实现排序逻辑即可,修复后的完整代码如下:
package traccia50719; // 给Comparable添加泛型约束,避免类型强转 public class Esame implements Comparable<Esame> { private int codice; private String nome; private int voto; public Esame(int codice, String nome, int voto){ this.codice=codice; this.nome=nome; this.voto=voto; } public void stampaesame(){ System.out.println("\n nome esame:" +this.nome); System.out.println("\n voto esame:" +this.voto); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Esame esa = (Esame) o; return codice == esa.codice; } // 补充重写hashCode,符合Java规范:equals返回true的两个对象hashCode必须相等 @Override public int hashCode() { return Integer.hashCode(codice); } // 修复compareTo逻辑,按考试编码升序排序,编码相同则判定为重复 @Override public int compareTo(Esame o) { return Integer.compare(this.codice, o.codice); } }
补充说明
- 修复后不同编码的考试都会正常存入
TreeSet,遍历时即可输出所有录入的考试记录 - 你如果不需要对考试做排序,也可以直接把
Studente类里的TreeSet替换为HashSet,只要保证equals和hashCode规则一致即可正常存储多个元素
内容的提问来源于stack exchange,提问作者Fabio Palladino
相关产品推荐
相关产品推荐

