2009-11-06 16 views
25

¿Cuál es la mejor implementación para este método de biblioteca de propósito general?Rompecabezas de Simple Java Map

public static <K, V> boolean containsEntry(
    Map<K, V> map, K key, V value) {} 

Criterios para juzgar este rompecabezas, al igual que con la mayoría de los puzzles de codificación, son en este orden:

  1. Integridad
  2. corrección
  3. Rendimiento
  4. belleza
  5. recibo de la contribución de PayPal

EDIT:

Bueno, ya que quedó cerrado, que bien podría publicar la respuesta. Creo que esto es probablemente óptima:

V valueForKey = map.get(key); 
    return (valueForKey == null) 
     ? value == null && map.containsKey(key) 
     : valueForKey.equals(value); 

Una solución sencilla sería inteligente:

return map.entrySet().contains(
     new AbstractMap.SimpleImmutableEntry<K, V>(key, value)); 

lo hace asignar una instancia, pero da la implementación mapa un poco más oportunidad de hacer algo óptimo.

+0

"Hay por lo menos una mejor respuesta" - No, la respuesta es ** una ** 'mejor' por definición ... – jjnguy

+0

Kevin, si vas a hacer preguntas similares a esta, debes establecer algunas reglas mejores. De lo contrario, esta no es una pregunta que pueda ser suficientemente respondida. – jjnguy

+3

Ok, lo estoy intentando. Ver editar. Tengo curiosidad acerca de su definición de mejor, sin embargo. Si cuatro cartas de mi mano de póker son 2 de tréboles, 3 de tréboles, as de espadas, as de corazones, ¿cuál es la mejor carta que podría tener? –

Respuesta

0

Es de suponer que está destinado a devolver un boolean:

public static <K, V> boolean containsEntry(Map<K, V> map, K key, V value) { 
    return map.containsKey(key) && map.get(key).equals(value); 
} 
+0

Vaya, arregló la publicación, gracias. Nos gustaría apoyar todos los valores posibles de 'clave' y 'valor'. –

3
public static <K, V> boolean containsEntry(Map<K, V> map, K key, V value) { 
    returns map.containsKey(key) && isEqual(map.get(key), value); 
} 
private static boolean isEqual(Object a, Object b) { 
    return a == null ? a == b : a.equals(b); 
} 

Copied from deleted post.

+0

¿Fue el uso de '&' en lugar de '&&' intencional? –

+0

Para ser sincero, no sé ... Lo copié directamente de la respuesta eliminada. – jjnguy

+2

¿hubo una respuesta eliminada? y lo copiaste? Estoy un poco confundido De todos modos, esto parece correcto, pero no es tan eficiente como podría ser. –