Tengo algún 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 yo quiero es ser capaz de comprobar si la lista contiene algunos de objeto por objeto del campo.
Por ejemplo:

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

pero overrided método Equals no me ayuda. ¿Qué estoy haciendo mal?
Gracias

ACTUALIZACIÓN
Y debo reemplazar un hashcode() método demasiado?

  • ha reemplazado equals() en la clase? si es así, puedes publicar aquí?
  • A juzgar por las respuestas de abajo, supongo que no hay ninguna solución práctica a este. Siento que esto se podría solucionar con un anónimo implementación de la clase, como el tipo que se utiliza cuando se llama a las Colecciones.sort() con el Comparador.
  • Después de buscar un poco más, he encontrado algunas respuestas útiles aquí: stackoverflow.com/questions/587404/…
InformationsquelleAutor nKognito | 2011-11-30

3 Comentarios

  1. 48

    aquí un poco de 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<A> list = new ArrayList<A>(); 
    
            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, no es un reemplazo de la equals(Object o) método. Entonces no es el reemplazo de la hashCode() así. También tenga en cuenta que el instanceof Un cheque en los iguales se asegurará de que usted no está tratando de comparar diferentes objetos.

    Que debe hacer el truco! Espero que ayudó! Saludos 🙂

    • buen ejemplo Gracias!
    • Funciona para containsAll método también?
    • Funciona para containsAll
    • Hola, yo estaba tratando de implementar lo mismo que hizo, para mi caso que tengo una clase POJO y estoy tratando de comparar un atributo contiene el método y no su trabajo como se espera. Podría usted por favor decirme en su caso, si usted tiene setter y getter para la identificación y el nombre ¿cuál es el valor de u va a pasar a contiene el método.
  2. 8

    Que no ha anulado el método en su clase. Con el fin de reemplazar los parámetros del método, también debe ser del mismo tipo.

    debe ser

    public boolean equals(Object o) {
    
    }

    donde como en su caso es

    public boolean equals(Long o) {
    
     }

    usted probablemente necesita hacer este

    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);
        }
    • He actualizado el código, pero el resultado es el mismo. Contiene no puede encontrar un objeto con id específico
    • puede usted por favor enviar el código correspondiente.
    • Ver mi respuesta para una explicación posible – «El otro problema …»
    • Creo ser una buena idea añadir un si antes de la fundición… if(!(o instanceof A)) return false;
  3. 7

    Lo que estoy haciendo mal?

    Que no son primordiales. Usted se sobrecarga.

    La contains método llama a la equals método con la firma equals(Object), por lo que esta (nueva), método que has añadido no será llamado.

    El otro problema es que su equals método tiene la mala semántica para contains. El contains método de necesidades para comparar this en contra de un objeto que podría ser un miembro de la lista. La lista no contiene Long objetos. Contiene objetos de tipo A.

    Ahora usted puede conseguir lejos con esto … si uso en crudo, los tipos de lista … pero lo que estamos tratando de hacer es una violación de la API de contrato, y la mala práctica. Una solución mejor es recorrer y probar los elementos de la lista de forma explícita.


    Y debo reemplazar un hashcode() método demasiado?

    Si reemplazar equals(Object), a continuación, también debe reemplazar hashcode().

    No va a hacer ninguna diferencia aquí, pero es esencial si usted nunca ha puesto su A objetos en hash estructuras de datos. Y ya que usted no sabe lo que el tipo de al lado se va a hacer con su código, es una buena práctica para asegurarse de que equals(Object) y hashCode() han compatible con la semántica.

    • Gracias por la explicación

Dejar respuesta

Please enter your comment!
Please enter your name here