【问题标题】:Treeset of exam printed打印的考试树集
【发布时间】:2021-12-20 03:22:58
【问题描述】:

您好,我有这 3 个课程: 这里我放了一个学生的名字和他参加的考试

package traccia50719;

import java.util.*;

public class Lab {

    public static void main(String[] args) {

        Studente studente = inserimento();
        System.out.println("fine inserimento\n");
        
        studente.print();
        System.out.println("\nfine programma");
    }

    private static Studente inserimento() {
        Studente s = null;
        Esame esame=null;
        System.out.println("\nmatricola:");
        Scanner mat = new Scanner(System.in);
        int matricola= mat.nextInt();
        System.out.println("\ncognome:");
        Scanner cog = new Scanner(System.in);
        String cognome= cog.next();
        System.out.println("\nNome:");
        Scanner nom = new Scanner(System.in);
        String nome= nom.next();
        s= new Studente(matricola, cognome, nome);

        do{
            System.out.println("\ncodice esame:");
            Scanner cod = new Scanner(System.in);
            int codicesame= cod.nextInt();
            if(codicesame==0){
                break;
            }
            System.out.println("\nNome esame:");
            Scanner nomes = new Scanner(System.in);
            String nomesame= nomes.next();
            System.out.println("\nvoto esame:");
            Scanner vot = new Scanner(System.in);
            int votoesame= vot.nextInt();
            esame = new Esame(codicesame,nomesame,votoesame);
            s.addEsame(esame);
            
        }while(true);
        
        return s;
    }

}

在这堂课中,我有学生使用构造函数,但是当我尝试使用迭代器打印考试时,我只打印了一个考试。为什么?

package traccia50719;

import java.util.*;

public class Studente {

    private int matricola;
    private String cognome;
    private String nome;
    private Set<Esame> esami = new TreeSet<Esame>();
    
    public Studente(int matricola, String cognome, String nome){
        this.matricola=matricola;
        this.cognome=cognome;
        this.nome=nome;

    }

    public void addEsame(Esame e){
        this.esami.add(e);
    }
    
    public void  print(){
        System.out.println("\nmatricola:" + this.matricola);
        System.out.println("\ncognome:" + this.cognome);
        System.out.println("\nnome:" + this.nome);
        Iterator<Esame> i = this.esami.iterator();
        while(i.hasNext()){
            Esame e = (Esame) i.next();
            e.stampaesame();
            
        }


    }
    
    
}

这是 3 级考试,我有 stampaEsame() 打印姓名和考试结果

package traccia50719;

public class Esame implements Comparable{

    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);

    }

    public boolean equals(Object o) {
        Esame esa =  (Esame) o;
        if(this.codice==esa.codice){
            return true;    
        }else return false;
        }
    

    public int compareTo(Object arg0) {
        // TODO Auto-generated method stub
        return 0;
    }
}

【问题讨论】:

  • 拥有compareTo 总是return 0 不是一个好主意,因为它意味着所有对象都是平等的。不同的Esame有不同的codice吗?
  • 这能回答你的问题吗? TreeSet only adding one value?

标签: java class object set treeset


【解决方案1】:

像这样用esami 替换该行。

private List<Esame> esami = new List<Esame>();

如果它是这样工作的,那么问题在于您覆盖 Esami 类的 hashCode() 和 equals() 方法的方式。由于这个TreeSet 将所有插入视为同一个元素,并且作为一个集合,它只能包含同一个元素的一个实例。

记住,hashCode() 和 equals() 必须是 overridden together ;)

【讨论】:

  • 完成但不起作用,我已经覆盖了 hashCode 和 equals :(
  • public int compareTo(Object arg0) { // TODO 自动生成的方法存根 return 0;那么问题就出在这个方法上,它说你的 Esami 对象等于任何你应该创建的对象是这样的 baeldung.com/java-compareto
  • 啊,好的,谢谢!它有效
  • @user9859592 如果我的回答解决了您的问题,请将其标记为已接受并点赞,以便其他人更容易找到并在工作中重复使用它。
猜你喜欢
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多