Domanda

sto usando di Guava collezione ArrayListMultimap<K,V> mappare Integers a Strings. La classe fornisce un metodo chiamato containsValue(Object value) che controlla se il Multimap contiene il valore specificato per un qualsiasi tasto. Una volta che determino che è vero, qual è il modo migliore per recuperare detto chiave?

ArrayListMultimap<String, Integer> myMap = ArrayListMultimap.create();

if (myMap.containsValue(new Integer(1))
{
   // retrieve the key? 
}
È stato utile?

Soluzione

Invece di usare containsValue si potrebbe iterare su myMap.entries () che restituisce un insieme di tutte le coppie chiave-valore. L'iteratore generata dalla collezione restituita attraversa i valori per una chiave, seguito dai valori di una seconda chiave, e così via:

Integer toFind = new Integer(1);
for (Map.Entry<String, Integer> entry: myMap.entries()) {
    if (toFind.equals(entry.getValue())) {
        // entry.getKey() is the first match
    }
}
// handle not found case

Se si guarda alla realizzazione di containsValue esso diventa subito itera oltre i valori della mappa così le prestazioni di fare questo con map.entries() invece di map.values() dovrebbe essere circa lo stesso.

public boolean containsValue(@Nullable Object value) {
    for (Collection<V> collection : map.values()) {
      if (collection.contains(value)) {
        return true;
      }
    }

    return false;
}

Nel caso generale, naturalmente, non v'è necessariamente una chiave unica per un dato valore in modo meno che non si sa che nella mappa ogni valore si verifica solo nei confronti di un singolo tasto si avrebbe bisogno di specificare il comportamento per esempio se si voleva la prima chiave chiave o l'ultima.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top