2016-10-11 5 views
0

私は電話帳を作りたいと思います。メソッドのエラーが含まれていますベクトルJava

メソッド "contains(OBJECT)==TRUE"で "while"ループに2つの同一オブジェクトを実行して入れても認識されません。

私のコードはどこで間違っていましたか?助けていただきありがとうございます!

メイン

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

クラス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; 
    } 

} 
+0

何が間違っていましたか?期待された結果と実際の結果は何でしたか? –

+0

真剣な疑問:「ベクター」を使った人や人は何ですか? 1998年にリリースされたJava 1.2(https://docs.oracle.com/javase/8/docs/api/java/util/Vector.html)からの使用は推奨されていません(https:// en.wikipedia.org/wiki/Java_version_history#J2SE_1.2)。 – dimo414

答えて

1

私はあなたが達成しようとしているのか理解していないが、あなたが今までwhileループに入るされていない理由は、ということですContattoクラスのObject.equalsメソッドをオーバーライドしていません。ここではObject.equalsの定義です:

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

「等しい」のこの定義を使用するには方法は、すべてのフィールドが同等の値を持っているかどうかは問題ではありません。 2つのオブジェクトは、同じオブジェクトでなければ等しくありません。

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のラングライブラリがなければ(ライブラリがやっていることと等価でなければなりません):

@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; 
} 

あなたの後2つのContattoインスタンス間の等価性の定義に一致するメソッドまたは実装を追加すると、等価なContattoオブジェクトを入力するとループ中にコードが入力されます。

+0

ありがとう!しかし、私は常にequalsBuilder()とHashCodeBuilder()でエラーが発生します。私は何かをインポートする必要がありますか? – Edoardo

+0

はい。この特定のソリューションを使用するには、Apache Commons Langライブラリをビルドに含める必要があり、 'org.apache.commons.lang3.builder.EqualsBuilder'と' org.apache.commons.lang3 'をインポートする必要があります。ビルダー.HashCodeBuilder'。このライブラリを使用したくない場合は、 'equals'メソッドと' hashCode'メソッドを適切に記述する方法について多くの情報があります。 –

+0

このライブラリを使用せずに私に例を挙げてくれてありがとう? – Edoardo

関連する問題