Java 我有两个arrayList<;myObject>;,I';我无法使用equals()来正确比较它们。为什么?
我有两个Java 我有两个arrayList<;myObject>;,I';我无法使用equals()来正确比较它们。为什么?,java,arraylist,equals,Java,Arraylist,Equals,我有两个arrayLists,其中myObject是我创建的自定义类的对象。我希望能够使用equals()方法比较这些ArrayList 在阅读并寻找答案之后,我了解到,某些对象(如int[])只有在引用同一对象时才被equals()方法视为相等 为了解决这个问题,我尝试在自定义对象中重写equals方法。我的对象有3个属性(所有基本类型),因此如果所有3个属性都等于所比较对象的属性,那么我的equals方法现在返回true,否则返回false。但是,比较ArrayList仍然不起作用。我做错了
arrayLists
,其中myObject
是我创建的自定义类的对象。我希望能够使用equals()
方法比较这些ArrayList
在阅读并寻找答案之后,我了解到,某些对象(如int[]
)只有在引用同一对象时才被equals()
方法视为相等
为了解决这个问题,我尝试在自定义对象中重写equals方法。我的对象有3个属性(所有基本类型),因此如果所有3个属性都等于所比较对象的属性,那么我的equals方法现在返回true
,否则返回false。但是,比较ArrayList仍然不起作用。我做错了什么
请原谅我解释代码而不是发布它,我这样做是因为变量和名称不是英文的
编辑:好的,这是代码Compra
是我的自定义类cantidad
、concepto
和id
是它的属性
@Override
public boolean equals(Object obj) {
boolean result = true;
if (obj == null) {
result = false;
}else{
Compra comprobada = (Compra) obj;
if(!(this.id == comprobada.getId())){
result = false;
}
if(!(this.cantidad == comprobada.getCantidad())){
result = false;
} if(!this.concepto.equals(comprobada.getConcepto())){
result = false;
}
}
return result;
}
由于您尚未发布代码,我建议您检查方法
compareTo
,以及如何将其用于自定义类。基于此方法:
如果您已经实现了自定义对象equals correct(您实际上覆盖了它并拥有了它),并且arrayList的大小相同,并且每对对象都相等,那么它将返回相等。换句话说,您试图做的是完全正确的,但是您的ArrayList实际上并没有以精确顺序包含完全相同的对象
通过执行System.out.println()来调查发生了什么,确保在检查集合相等性时调用了equal。
如果您不介意,请发送与您的对象相等的内容
我在一个单独的示例中运行您的代码,效果很好(outtputs true)——我改进了equals方法,这样它就不会执行太多if检查,因为如果其中只有一个不相等,那么它应该返回false
class stackoverflow {
public static void main(String args[]){
ArrayList<Compra> array1 = new ArrayList<>();
ArrayList<Compra> array2 = new ArrayList<>();
array1.add(new Compra(1,2,"test"));
array2.add(new Compra(1,2,"test"));
System.out.println(array1.equals(array2));
}
}
class Compra {
int id;
int cantidad;
String concepto;
public Compra(int id, int cantidad, String concepto){
this.id = id;
this.cantidad = cantidad;
this.concepto = concepto;
}
public boolean equals(Object obj) {
if (obj == null) {
return false;
}else{
Compra comprobada = (Compra) obj;
if(!(this.id == comprobada.getId())){
return false;
}
if(!(this.cantidad == comprobada.getCantidad())){
return false;
}
if(!this.concepto.equals(comprobada.getConcepto())){
return false;
}
}
return true;
}
public int getId() {
return id;
}
public int getCantidad() {
return cantidad;
}
public String getConcepto() {
return concepto;
}
}
类堆栈溢出{
公共静态void main(字符串参数[]){
ArrayList array1=新的ArrayList();
ArrayList array2=新的ArrayList();
增加(新的压缩(1,2,“测试”);
增加(新的压缩机(1,2,“测试”);
System.out.println(array1.equals(array2));
}
}
压缩级{
int-id;
内坎蒂达德;
字符串概念;
公共压缩(int-id,int-cantidad,String-concepto){
this.id=id;
this.cantidad=cantidad;
this.concepto=concepto;
}
公共布尔等于(对象obj){
if(obj==null){
返回false;
}否则{
Compra compobada=(Compra)obj;
如果(!(this.id==comprobada.getId()){
返回false;
}
如果(!(this.cantidad==comprobada.getCantidad()){
返回false;
}
如果(!this.concepto.equals(comprobada.getConcepto())){
返回false;
}
}
返回true;
}
公共int getId(){
返回id;
}
公共int getCantidad(){
返回康蒂达;
}
公共字符串getConcepto(){
返回概念;
}
}
需要检查的内容:
- 您确定不更改ArrayList中的顺序吗??:
- 您是否打印以确保这些相等检查发生并按预期返回true或false
- 您确定concepto字符串完全相同,大小写相同,不包含额外的空格等吗
id
、cantidad
或concepto
是字符串,则需要使用.equals()
,不==
。请检查下面的答案,并告诉我您是否在代码中发现了使事情无法正常工作的内容;)-您的代码与我的示例运行良好嘿,感谢您花时间编写并尝试代码。我在比较时仍然得到错误。我非常确定这两个数组是相等的,因为它们都是通过读取同一个文件两次创建的。我正在调试一切,以防我遗漏了什么。什么错误?您可能正在传递不同类型的对象-确保这段代码不是bug所在的地方。有例外吗?