2011-02-10 8 views
8
List<Pair<String, String> > lp = new ArrayList<Pair<String, String> >(); 
    lp.add(new Pair("1", "2")); 

¿Cómo debo comprobar si la lista lp contiene 1 y 2 es decir, el par ("1", "2").Contiene para la lista del par

Respuesta

7

Su clase Pair necesita implementar equals() y hashCode() y ya está todo listo. List.contains() se implementa en términos del método equals() del tipo. Vea el API for List.contains(). (Editado un poco para abordar los comentarios de @maaartinus, cuya respuesta debes leer porque las observaciones son sólidas, y es un poco ridículo que las incluya aquí. Como señala maaartinus, una de las mejores prácticas aquí sería evite definiciones manuales propensas a errores para equals y hashcode, y en su lugar construya sobre las funciones auxiliares de Guava para nullable equals y hashCode for n objects).

final class Pair<T> { 

    final T left; 
    final T right; 

    public Pair(T left, T right) 
    { 
    if (left == null || right == null) { 
     throw new IllegalArgumentException("left and right must be non-null!"); 
    } 
    this.left = left; 
    this.right = right; 
    } 

    public boolean equals(Object o) 
    { 
    // see @maaartinus answer 
    if (! (o instanceof Pair)) { return false; } 
    Pair p = (Pair)o; 
    return left.equals(p.left) && right.equals(p.right); 
    } 

    public int hashCode() 
    { 
     return 7 * left.hashCode() + 13 * right.hashCode(); 
    } 
} 

Con adecuada equals(), ahora se puede hacer:

lp.add(new Pair("1", "2")); 
    assert lp.contains(new Pair("1","2")); 

Respondiendo a los siguientes comentarios, tal vez sería bueno incluir una buena referencia para "¿Por qué necesito para implementar hashCode()?"

+0

Buena respuesta. Creo que te empujé más de 3000. Genial. –

+1

Y una punta del sombrero para ti, Hovercraft ... – andersoj

+0

Thx @spong para la solución. – andersoj

1

La implementación de la respuesta por andersoj

return left != null && right != null && left.equals(p.left) && right.equals(p.right); 

es incorrecto: las pruebas nulas sugieren claramente que nulo es un valor legal para la izquierda y la derecha. Así que hay al menos dos problemas: allí

  • new Pair(null, null).hashCode() tiros NPE
  • new Pair(null, null) no es igual a sí mismo!

Echa un vistazo a Guava clase Objetos para una correcta implementación. Úselo o escriba un ayudante estático métodos como

public static boolean equal(Object a, Object b) { 
    return a==b || a!=null && a.equals(b); 
} 
public static int hashCode(Object a) { 
    return a==null ? 0 : a.hashCode(); 
} 

y siempre úselos.

Nunca escriba equals que contenga una prueba nula.

Es fácil de soplar, y nadie lo notó. Utilizando el ayudante, es trivial para hacerlo bien:

public boolean equals(Object o) { 
    if (!(o instanceof Pair)) return false; 
    Pair p = (Pair) o; 
    return Helper.equals(left, p.left) && Helper.equals(right, p.right); 
} 

public int hashCode() { 
    return 7 * Helper.hashCode(left) + 13 * Helper.hashCode(right); 
} 

Por supuesto, prohibiendo los nulos en el constructor es una opción, también.

+0

+1: Tiene razón, y ciertamente no hice la debida diligencia para hacerlo perfecto. Gracias por asegurarte de que sea correcto. Si tuviera +2 para ofrecer, lo daría por la dirección "Usar guayaba". – andersoj

+0

Gracias .... después de haberlo equivocado dos veces, escribí el Ayudante y me prohibí hacerlo manualmente. – maaartinus

+0

No puedo hacer que ninguna de estas respuestas funcione. ¿Puedes ayudarme? ¿Qué diablos es Helper, etc. –

Cuestiones relacionadas