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
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
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()
?"
JavaPractices.com — Implementing equals()
— "si reemplaza iguales, debe anular hashCode"
Object.equals()
contract as defined in the API documentation
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 NPEnew 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.
+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
Gracias .... después de haberlo equivocado dos veces, escribí el Ayudante y me prohibí hacerlo manualmente. – maaartinus
No puedo hacer que ninguna de estas respuestas funcione. ¿Puedes ayudarme? ¿Qué diablos es Helper, etc. –
Buena respuesta. Creo que te empujé más de 3000. Genial. –
Y una punta del sombrero para ti, Hovercraft ... – andersoj
Thx @spong para la solución. – andersoj