2009-11-06 27 views
25

Qual è l'implementazione migliore per questo metodo di libreria generico?Simple Java Map puzzle

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

criteri per giudicare questo puzzle, come la maggior parte i puzzle di codifica, sono in questo ordine:

  1. Completezza
  2. Correttezza
  3. prestazioni
  4. bellezza
  5. ricevuta del contributo PayPal

EDIT:

Ebbene, dal momento che ha ottenuto chiuso, potrei anche inviare la risposta. Penso che questo è probabilmente ottimale:

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

Una soluzione semplice intelligente potrebbe essere:

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

lo fa assegnare un esempio, ma dà l'implementazione mappa un po 'più opportunità di fare qualcosa ottimale.

+0

"C'è almeno una risposta migliore" - No, la risposta è ** one ** "best" per definizione ... – jjnguy

+0

Kevin, se hai intenzione di fare domande simili a questa, devi stabilire alcune regole migliori. Altrimenti, questa non è una domanda a cui si possa rispondere a sufficienza. – jjnguy

+3

Ok, ci sto provando. Vedi modifica. Sono curioso della tua definizione di migliore, però. Se quattro carte della mia mano di poker sono 2 di fiori, 3 di fiori, asso di picche, asso di cuori, qual è la migliore quinta carta che potrei avere? –

risposta

0

Presumibilmente è pensata per restituire 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

Whoops, risolto il post, grazie. Desideriamo supportare tutti i possibili valori di "chiave" e "valore". –

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

Era l'uso di '&' piuttosto che '&&' intentional? –

+0

Ad essere sincero, non so ... l'ho copiato direttamente dalla risposta cancellata. – jjnguy

+2

c'era una risposta cancellata? e l'hai copiato? Sono un po 'confuso. Ad ogni modo, sembra corretto, ma non è così performante come potrebbe essere. –