我想制作电话簿。
" 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;
}
}
答案 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循环。