方法错误包含Vector java

时间:2016-10-11 16:53:58

标签: java vector contains

我想制作电话簿。

" while"无法识别执行和放置两个相同的对象。循环使用方法" contains(OBJECT)==TRUE"。

我的代码出了什么问题?感谢任何帮助,谢谢!

主要

public class MainRubrica {

    public static void main(String[] args) {
        Scanner keyb= new Scanner(System.in); 

        System.out.print("Inserire il numero di contatti da aggiungere: ");
        int nM= keyb.nextInt(); 

        Vector<Contatto> rubrica = new Vector<Contatto>(20, 5);

        for(int i=0;i<nM;i++){
            System.out.println("\nContatto n."+(i+1));
            Contatto c =new Contatto();
            c.inserimento();
            while(rubrica.contains(c)==true) {
                System.out.println("Il contatto è già presente");
                c.inserimento();
            }
            rubrica.addElement(c);
        }

        for(int i=0;i<nM;i++){
            System.out.println("\nContatto n."+(i+1));
            System.out.println(rubrica.elementAt(i));
        }

Class Contatto

public class Contatto {
    //attributi
    private String nome; 
    private String cognome;
    private String numeroTel;

    //costruttore di default
    public Contatto(){
        nome=""; 
        cognome="";
        numeroTel=""; }

    //costruttore con parametri
    public Contatto(String nome, String cognome, String numeroTel){
        this.nome=nome; 
        this.cognome=cognome; 
        this.numeroTel=numeroTel; }

    //metodo set
    public void setNome(String nome){
        this.nome=nome; }
    public void setCognome(String congnome){
        this.cognome=cognome; }
    public void setNumeroTel(String numeroTel){
        this.numeroTel=numeroTel; }

    //metodo get
    public String getNome(){
        return nome; }
    public String getCognome(){
        return cognome; }
    public String getNumeroTel(){
        return numeroTel; }

    //metodo inserimentoContatto
    public void inserimento(){
        Scanner keyb= new Scanner(System.in); 
        System.out.println("Nome: ");
        nome=keyb.nextLine(); 
        System.out.println("Cognome: ");
        cognome=keyb.nextLine();  
        System.out.println("Numero di telefono: ");
        numeroTel=keyb.nextLine(); 
    }

    public String toString(){
        return "Nome: "+nome+"\nCognome: "+cognome+"\nNumero di Telefono: "+numeroTel; 
    }

}

1 个答案:

答案 0 :(得分:1)

我不明白你想要完成什么,但是你没有进入while循环的原因是你没有覆盖Contatto类的Object.equals方法。这是Object.equals的定义:

public boolean equals(Object obj) {
    return (this == obj);
}

使用“equals”方法的这个定义,所有字段是否具有等效值都无关紧要。除非它们是同一个对象,否则这两个对象不相等。

覆盖Contatto类中的equals方法将解决此问题。当你这样做时,你还需要覆盖Object.hashCode方法,以便维护该方法的契约(相等的对象必须具有相同的哈希码)。我喜欢使用Apache Commons Lang库。使用该库,您可以向Contatto类添加类似这些方法的内容:

@Override
public boolean equals(final Object obj) {
    if (this == obj) {
        return true;
    } else if (obj instanceof Contatto) {
        final Contatto rhs = (Contatto) obj;
        return new EqualsBuilder().append(getNome(), rhs.getNome())
                .append(getCognome(), rhs.getCognome())
                .append(getNumeroTel(), rhs.getNumeroTel())
                .isEquals();
    } else {
        return false;
    }
}

@Override
public int hashCode() {
    return new HashCodeBuilder().append(getNome()).append(getCognome())
            .append(getNumeroTel()).toHashCode();
}

没有Apache Commons Lang库(应该等同于库正在做的事情):

@Override
public boolean equals(final Object obj) {
    if (this == obj) {
        return true;
    } else if (obj instanceof Contatto) {
        final Contatto rhs = (Contatto) obj;
        return Objects.equals(getNome(), rhs.getNome())
                && Objects.equals(getCognome(), rhs.getCognome())
                && Objects.equals(getNumeroTel(), rhs.getNumeroTel());
    } else {
        return false;
    }
}

@Override
public int hashCode() {
    int hash = 17 * 37 + getNome().hashCode();
    hash = hash * 37 + getCognome().hashCode();
    hash = hash * 37 + getNumeroTel().hashCode();
    return hash;
}

添加这些方法或它们的实现与两个Contatto实例之间的相等定义相匹配后,如果输入等效的Contatto对象,则应该看到代码进入while循环。