You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:06:07