我检查2个对象(数组列表中的一个新对象)是否匹配。如果他们这样做,程序会打印"Company exists already!"
,如果它们不匹配,则新对象会被添加到列表中。
问题在于,当我尝试将相同的对象(相同的值)放两次时,它表明它已经存在,就像它应该但是当我输入完全新的对象(具有不同的值)时,它仍然显示该消息但是将对象添加到数组列表
if(companyList.size()!=0){
for(i=0;i<companyList.size();i++){
Company oldCom = companyList.get(i);
if(newUab.equals(oldCom)==true){
JOptionPane.showMessageDialog(null, "Company exists already!");
break;
}
else{
companyList.add(newUab);
}
}
}
else{
companyList.add(newUab);
}
我试过这个System.out.println(newUab.equals(oldCom));
并且总是给true
但我不明白为什么当它们不同时,对象被放入数组列表中,当它们相同时它不会在两种情况下都打印出消息?
我是否遗漏了某些内容,或者我花了多长时间查看代码并且再也看不到我的错误了?
编辑:我把这两个类都放了,因为我对一些方法的工作缺乏了解(我认为它应该是UAB类方法导致该对象属于这个类) 公司类(父母)
public class Company {
public String b;// boss
public String n;// name
public Company(String boss, String name){
b=boss;
n=name;
}
@Override
public int hashCode() {
int hash = 7;
int newHash;
hash = 43 * hash + Objects.hashCode(this.b);
hash = 43 * hash + Objects.hashCode(this.n);
newHash=hash;
return newHash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Company other = (Company) obj;
if (!Objects.equals(this.b, other.b)) {
return false;
}
if (!Objects.equals(this.n, other.n)) {
return false;
}
return true;
}
UAB班(公司的孩子):
public class UAB extends Company {
private int w;//workers
public UAB(String boss,String name,int workers){
super(boss,name);
w=workers;
}
@Override
public int hashCode() {
int hash = 3;
hash = 17 * hash + this.w;
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final UAB other = (UAB) obj;
if (this.w != other.w) {
return false;
}
return true;
}
答案 0 :(得分:4)
答案 1 :(得分:3)
您的问题在这里&gt;&gt;
else{
companyList.add(newUab);
}
正如你所说的新对象,它打印出“公司已经存在!” 并且仍然添加它,然后添加到列表的执行将在上面的行
答案 2 :(得分:1)
如果对象与列表中的第一个不匹配,则会将其添加到数组中。在与列表中的每个对象进行比较之前,无法添加到数组中。一个更好的解决方案可能是调用list。contains(newUab),而不是自己迭代列表并调用.equals。
答案 3 :(得分:0)
首先让我们来看看你现有的 equals 方法。你正在使用Objects.equals方法,这有点奇怪,因为它只是在检查无效后调用 firstArgument .equals( secondArgument ),但你已经检查了一下
你应该做什么:
@Override
public boolean equals(Object obj) {
if ( ! obj instanceof Company ) {
return false;
}
Company other = (Company) obj;
return this.b.equals(other.b) && this.n.equals(other.n);
}
正如其他人所说,您应该使用List接口的contains方法而不是实现自己的方法。此外,如果对象的顺序不重要,您应该考虑使用Set。在集合中,你不能有重复项,如果你试图添加一个&#34;等于&#34;那么添加就会失败(返回false)。元件。
此外,在您的UAB课程中,您还需要检查 b 和 n 参数。您可以使用&#34; super&#34;来调用父 equals 方法。关键字...
另一个建议:查找java源代码!去看看在ArrayList和其他类中做了什么。您将看到它们如何实现contains方法,您可以将其作为起点。