El método de contenido personalizado de ArrayList

Tengo un objeto

class A { private Long id; private String name; public boolean equals(Long v) { return this.id.equals(v); } } 

y ArrayList de estos objetos. Lo que quiero es poder verificar si esa lista contiene algún objeto por campo de objeto. Por ejemplo:

 ArrayList list = new ArrayList(); if (list.contains(0L)) {...} 

pero el método Equals anulado no me ayuda. ¿Que estoy haciendo mal? Gracias

ACTUALIZACIÓN ¿ Y debería reemplazar un método hashcode () también?

Aquí hay un código que podría demostrar cómo funciona:

 import java.util.ArrayList; class A { private Long id; private String name; A(Long id){ this.id = id; } @Override public boolean equals(Object v) { boolean retVal = false; if (v instanceof A){ A ptr = (A) v; retVal = ptr.id.longValue() == this.id; } return retVal; } @Override public int hashCode() { int hash = 7; hash = 17 * hash + (this.id != null ? this.id.hashCode() : 0); return hash; } } public class ArrayList_recap { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add(new A(0L)); list.add(new A(1L)); if (list.contains(new A(0L))) { System.out.println("Equal"); } else { System.out.println("Nah."); } } } 

Primero, hay una anulación del método equals (Object o). Luego está la anulación del hashCode () también. También tenga en cuenta que la instancia de A check en los iguales garantizará que no intente comparar diferentes objetos.

¡Eso debería hacer el truco! Espero que haya sido de ayuda! Saludos 🙂

No ha anulado el método en su clase. Para anular, los parámetros del método también deben ser del mismo tipo.

debería ser

 public boolean equals(Object o) { } 

donde como en tu caso es

 public boolean equals(Long o) { } 

probablemente necesites hacer esto

 public boolean equals(Object o) { if (o == null) return false; if (o == this) return true; //if both pointing towards same object on heap A a = (A) o; return this.id.equals(a.id); } 

¿Que estoy haciendo mal?

Usted no está anulando. Estás sobrecargando

El método contains llama al método equals con signature equals(Object) , por lo que no se llamará a este (nuevo) método que haya agregado.

El otro problema es que su método equals tiene una semántica incorrecta para contains . El método contains necesita comparar this con un objeto que podría ser miembro de la lista. Su lista no contiene objetos Long . Contiene objetos de tipo A

Ahora puede salirse con la suya con esto … si usa tipos de listas sin procesar … pero lo que está tratando de hacer es una violación del contrato de la API y una mala práctica. Una mejor solución es iterar y probar los elementos de la lista explícitamente.


¿Y debería reemplazar un método hashcode () también?

Si anula equals(Object) entonces también debe anular hashcode() .

No hará ninguna diferencia aquí, pero es esencial si alguna vez colocas tus objetos A en estructuras de datos hash. Y como no sabe qué va a hacer el siguiente tipo con su código, es una buena práctica asegurarse de que equals(Object) y hashCode() tengan semántica compatible.