Java Hashmap: jak uzyskać klucz z wartości?

Jeśli mam wartość "foo" i HashMap<String> ftw dla której ftw.containsValue("foo") zwraca true, Jak mogę uzyskać odpowiedni klucz? Czy muszę przeglądać hashmapę? Jak najlepiej to zrobić?

 380
Author: Nick Heiner, 2009-09-05

30 answers

Jeśli zdecydujesz się użyć Commons Collections library zamiast standardowego Java Collections API, możesz to osiągnąć z łatwością.

Interfejs

Interfejs BidiMap w bibliotece Collections jest mapą dwukierunkową, pozwalającą na mapowanie klucza do wartości (jak zwykłe mapy), a także mapowanie wartości do klucza, co pozwala na wyszukiwanie w obu kierunkach. Uzyskanie klucza dla wartości jest obsługiwane przez metodę getKey () .

Jest zastrzeżenie jednak mapy bidi nie mogą mieć wielu wartości mapowanych do kluczy, a zatem jeśli zestaw danych nie ma mapowań 1:1 między kluczami i wartościami, nie można używać map bidimaps.

Update

Jeśli chcesz polegać na Java Collections API, musisz zapewnić relację 1:1 między kluczami i wartościami w momencie wstawiania wartości do mapy. Łatwiej powiedzieć niż zrobić.

Gdy możesz to zapewnić, użyj metody entrySet () , aby uzyskać zbiór wpisy (mappingi) na mapie. Po uzyskaniu zbioru, którego typem jest Mapa.Wpis , iterować poprzez wpisy, porównując zapisaną wartość z oczekiwaną i uzyskać odpowiedni klucz .

Aktualizacja #2

Wsparcie dla map bidi z generics można znaleźć w Google Guava i refactored Commons-Collections biblioteki (ta ostatnia nie jest projektem Apache). Podziękowania dla firmy Esko za wskazanie brakujących ogólne wsparcie w zbiorach Apache Commons. Używanie kolekcji z generikami sprawia, że kod jest łatwiejszy do utrzymania.

 195
Author: Vineet Reynolds,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-28 21:14:45

Jeśli twoja struktura danych ma mapowanie many-To-one pomiędzy kluczami i wartościami, powinieneś iterację nad wpisami i wybrać wszystkie odpowiednie klucze:

public static <T, E> Set<T> getKeysByValue(Map<T, E> map, E value) {
    Set<T> keys = new HashSet<T>();
    for (Entry<T, E> entry : map.entrySet()) {
        if (Objects.equals(value, entry.getValue())) {
            keys.add(entry.getKey());
        }
    }
    return keys;
}

W przypadku relacji jeden do jednego , możesz zwrócić pierwszy dopasowany klucz:

public static <T, E> T getKeyByValue(Map<T, E> map, E value) {
    for (Entry<T, E> entry : map.entrySet()) {
        if (Objects.equals(value, entry.getValue())) {
            return entry.getKey();
        }
    }
    return null;
}

W Javie 8:

public static <T, E> Set<T> getKeysByValue(Map<T, E> map, E value) {
    return map.entrySet()
              .stream()
              .filter(entry -> Objects.equals(entry.getValue(), value))
              .map(Map.Entry::getKey)
              .collect(Collectors.toSet());
}
Ponadto, dla użytkowników guawy, może być przydatna BiMap . Na przykład:
BiMap<Token, Character> tokenToChar = 
    ImmutableBiMap.of(Token.LEFT_BRACKET, '[', Token.LEFT_PARENTHESIS, '(');
Token token = tokenToChar.inverse().get('(');
Character c = tokenToChar.get(token);
 559
Author: Vitalii Fedorenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-25 04:40:58
public class NewClass1 {

    public static void main(String[] args) {
       Map<Integer, String> testMap = new HashMap<Integer, String>();
        testMap.put(10, "a");
        testMap.put(20, "b");
        testMap.put(30, "c");
        testMap.put(40, "d");
        for (Entry<Integer, String> entry : testMap.entrySet()) {
            if (entry.getValue().equals("c")) {
                System.out.println(entry.getKey());
            }
        }
    }
}

Kilka dodatkowych informacji... Może Ci się przydać

Powyższa metoda może nie być dobra, jeśli twoja hashmapa jest naprawdę duża. Jeśli twoja hashmapa zawiera unikalny klucz do unikalnego mapowania wartości, możesz zachować jeszcze jeden hashmap zawierający mapowanie od wartości do klucza.

Czyli musisz utrzymać dwa hashmapy

1. Key to value

2. Value to key 

W takim przypadku możesz użyć drugiej hashmapy, aby uzyskać klucz.

 70
Author: Fathah Rehman P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-02 05:54:28

Możesz wstawić zarówno klucz, parę wartości, jak i jej odwrotność do struktury Mapy

map.put("theKey", "theValue");
map.put("theValue", "theKey");

Korzystanie z mapy.get ("theValue") zwróci"theKey".

Jest to szybki i brudny sposób, że zrobiłem stałe mapy, które będą działać tylko dla wybranych kilku zbiorów danych:

  • zawiera tylko 1 do 1 par
  • zbiór wartości jest oddzielony od zbioru kluczy (1->2, 2->3 breaks it)
 19
Author: Chicowitz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-04 00:42:41

Myślę, że Twoje wybory są

  • Użyj implementacji map stworzonej do tego celu, jak BiMap z kolekcji google. Należy pamiętać, że google collections BiMap wymaga unikalnych wartości, a także kluczy, ale zapewnia wysoką wydajność w obu kierunkach wydajność
  • ręcznie utrzymuj dwie mapy - jedną dla klucza -> wartości, a drugą dla klucza - > wartości
  • iterować przez {[0] } i znaleźć klucze, które pasują do wartości. Jest to najwolniejsza metoda, ponieważ wymaga iteracji przez całą kolekcję, podczas gdy dwie pozostałe metody tego nie wymagają.
 17
Author: Chi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-28 21:30:53

Aby znaleźć wszystkie klucze, które odwzorowują tę wartość, przejrzyj wszystkie pary w hashmapie, używając map.entrySet().

 11
Author: wsorenson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-04 12:23:02

Nie ma jednoznacznej odpowiedzi, ponieważ wiele klawiszy może odwzorować tę samą wartość. Jeśli wymuszasz unikalność za pomocą własnego kodu, najlepszym rozwiązaniem jest utworzenie klasy, która używa dwóch HashMap do śledzenia mapowań w obu kierunkach.

 10
Author: recursive,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-05 17:08:57

Udekoruj mapę własną implementacją

class MyMap<K,V> extends HashMap<K, V>{

    Map<V,K> reverseMap = new HashMap<V,K>();

    @Override
    public V put(K key, V value) {
        // TODO Auto-generated method stub
        reverseMap.put(value, key);
        return super.put(key, value);
    }

    public K getKey(V value){
        return reverseMap.get(value);
    }
}
 10
Author: ABHI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-23 13:45:03

Myślę, że to najlepsze rozwiązanie, oryginalny adres: Java2s

    import java.util.HashMap;
    import java.util.Map;

        public class Main {

          public static void main(String[] argv) {
            Map<String, String> map = new HashMap<String, String>();
            map.put("1","one");
            map.put("2","two");
            map.put("3","three");
            map.put("4","four");

            System.out.println(getKeyFromValue(map,"three"));
          }


// hm is the map you are trying to get value from it
          public static Object getKeyFromValue(Map hm, Object value) {
            for (Object o : hm.keySet()) {
              if (hm.get(o).equals(value)) {
                return o;
              }
            }
            return null;
          }
        }

Łatwa obsługa: jeśli umieścisz wszystkie dane w hasMap i masz item = "Automobile" , więc szukasz jego klucza w hashMap. to dobre rozwiązanie.

getKeyFromValue(hashMap, item);
System.out.println("getKeyFromValue(hashMap, item): "+getKeyFromValue(hashMap, item));
 8
Author: boy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-22 06:21:55

Jeśli zbudujesz mapę w swoim własnym kodzie, spróbuj umieścić klucz i wartość na mapie razem:

public class KeyValue {
    public Object key;
    public Object value;
    public KeyValue(Object key, Object value) { ... }
}

map.put(key, new KeyValue(key, value));

Wtedy, gdy masz wartość, masz również klucz.

 7
Author: David Tinker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-05 17:58:54

Obawiam się, że będziesz musiał zmienić swoją mapę. Najkrótszy, jaki mogłem wymyślić:

Iterator<Map.Entry<String,String>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
    Map.Entry<String,String> entry = iter.next();
    if (entry.getValue().equals(value_you_look_for)) {
        String key_you_look_for = entry.getKey();
    }
}
 6
Author: André van Toly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-28 09:52:58
for(int key: hm.keySet()) {
    if(hm.get(key).equals(value)) {
        System.out.println(key); 
    }
}
 6
Author: user309309,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-05 12:35:07

Wygląda na to, że najlepszym sposobem jest iteracja nad wpisami za pomocą map.entrySet(), ponieważ map.containsValue() prawdopodobnie i tak to robi.

 6
Author: Jonas Klemming,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-22 06:11:34

Używanie Javy 8:

ftw.forEach((key, value) -> {
    if (value=="foo") {
        System.out.print(key);
    }
});
 5
Author: phani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-09 10:32:04

Dla android development targeting API Objects.equals nie jest zaimplementowane. Oto prosta alternatywa:

public <K, V> K getKeyByValue(Map<K, V> map, V value) {
    for (Map.Entry<K, V> entry : map.entrySet()) {
            if (value.equals(entry.getValue())) {
            return entry.getKey();
        }
    }
    return null;
}
 5
Author: The Berga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-14 14:14:31

Możesz użyć poniższego:

public class HashmapKeyExist {
    public static void main(String[] args) {
        HashMap<String, String> hmap = new HashMap<String, String>();
        hmap.put("1", "Bala");
        hmap.put("2", "Test");

        Boolean cantain = hmap.containsValue("Bala");
        if(hmap.containsKey("2") && hmap.containsValue("Test"))
        {
            System.out.println("Yes");
        }
        if(cantain == true)
        {
            System.out.println("Yes"); 
        }

        Set setkeys = hmap.keySet();
        Iterator it = setkeys.iterator();

        while(it.hasNext())
        {
            String key = (String) it.next();
            if (hmap.get(key).equals("Bala"))
            {
                System.out.println(key);
            }
        }
    }
}
 3
Author: Balasubramanian Ganapathi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-09 23:24:22

Możesz uzyskać klucz używając wartości używając następującego kodu..

ArrayList valuesList = new ArrayList();
Set keySet = initalMap.keySet();
ArrayList keyList = new ArrayList(keySet);

for(int i = 0 ; i < keyList.size() ; i++ ) {
    valuesList.add(initalMap.get(keyList.get(i)));
}

Collections.sort(valuesList);
Map finalMap = new TreeMap();
for(int i = 0 ; i < valuesList.size() ; i++ ) {
    String value = (String) valuesList.get(i);

    for( int j = 0 ; j < keyList.size() ; j++ ) {
        if(initalMap.get(keyList.get(j)).equals(value)) {
            finalMap.put(keyList.get(j),value);
        }   
    }
}
System.out.println("fianl map ---------------------->  " + finalMap);
 2
Author: Amit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-12 14:26:58
public static class SmartHashMap <T1 extends Object, T2 extends Object> {
    public HashMap<T1, T2> keyValue;
    public HashMap<T2, T1> valueKey;

    public SmartHashMap(){
        this.keyValue = new HashMap<T1, T2>();
        this.valueKey = new HashMap<T2, T1>();
    }

    public void add(T1 key, T2 value){
        this.keyValue.put(key, value);
        this.valueKey.put(value, key);
    }

    public T2 getValue(T1 key){
        return this.keyValue.get(key);
    }

    public T1 getKey(T2 value){
        return this.valueKey.get(value);
    }

}
 2
Author: margus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-12 20:24:54
public static String getKey(Map<String, Integer> mapref, String value) {
    String key = "";
    for (Map.Entry<String, Integer> map : mapref.entrySet()) {
        if (map.getValue().toString().equals(value)) {
            key = map.getKey();
        }
    }
    return key;
}
 2
Author: Amazing India,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-22 07:34:51

Tak, musisz zapętlić hashmapę, chyba że zaimplementujesz coś zgodnie z tym, co sugerują te różne odpowiedzi. Zamiast majstrować przy entrySet, chciałbym po prostu dostać keySet (), iterate nad tym zestawem, i zachować (pierwszy) klucz, który daje Ci pasującą wartość. Jeśli potrzebujesz wszystkich kluczy, które pasują do tej wartości, oczywiście musisz zrobić wszystko.

Jak sugeruje Jonas, może to być już to, co robi metoda containsValue, więc możesz po prostu pominąć to przetestuj wszystko razem i po prostu zrób iterację za każdym razem(a może kompilator już wyeliminuje redundancję, kto wie).

Również, w stosunku do innych odpowiedzi, jeśli odwrotna Mapa wygląda jak

Map<Value, Set<Key>>

Możesz poradzić sobie z niestandardowymi mapowaniami wartości key ->, jeśli potrzebujesz tej możliwości (rozplątanie ich na bok). To włączyłoby fine do każdego z rozwiązań, które ludzie sugerują tutaj za pomocą dwóch map.

 1
Author: Carl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-05 19:45:31
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

public class ValueKeysMap<K, V> extends HashMap <K,V>{
    HashMap<V, Set<K>> ValueKeysMap = new HashMap<V, Set<K>>();

    @Override
    public boolean containsValue(Object value) {
        return ValueKeysMap.containsKey(value);
    }

    @Override
    public V put(K key, V value) {
        if (containsValue(value)) {
            Set<K> keys = ValueKeysMap.get(value);
            keys.add(key);
        } else {
            Set<K> keys = new HashSet<K>();
            keys.add(key);
            ValueKeysMap.put(value, keys);
        }
        return super.put(key, value);
    }

    @Override
    public V remove(Object key) {
        V value = super.remove(key);
        Set<K> keys = ValueKeysMap.get(value);
        keys.remove(key);
        if(keys.size() == 0) {
           ValueKeysMap.remove(value);
        }
        return value;
    }

    public Set<K> getKeys4ThisValue(V value){
        Set<K> keys = ValueKeysMap.get(value);
        return keys;
    }

    public boolean valueContainsThisKey(K key, V value){
        if (containsValue(value)) {
            Set<K> keys = ValueKeysMap.get(value);
            return keys.contains(key);
        }
        return false;
    }

    /*
     * Take care of argument constructor and other api's like putAll
     */
}
 1
Author: Kanagavelu Sugumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-25 06:06:54
/**
 * This method gets the Key for the given Value
 * @param paramName
 * @return
 */
private String getKeyForValueFromMap(String paramName) {
    String keyForValue = null;
    if(paramName!=null)) {
        Set<Entry<String,String>> entrySet = myMap().entrySet();
        if(entrySet!=null && entrySet.size>0) {
            for(Entry<String,String> entry : entrySet) {
                if(entry!=null && paramName.equalsIgnoreCase(entry.getValue())) {
                    keyForValue = entry.getKey();
                }
            }
        }
    }
    return keyForValue;
}
 1
Author: kanaparthikiran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-22 05:56:27
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class M{
public static void main(String[] args) {

        HashMap<String, List<String>> resultHashMap = new HashMap<String, List<String>>();

        Set<String> newKeyList = resultHashMap.keySet();


        for (Iterator<String> iterator = originalHashMap.keySet().iterator(); iterator.hasNext();) {
            String hashKey = (String) iterator.next();

            if (!newKeyList.contains(originalHashMap.get(hashKey))) {
                List<String> loArrayList = new ArrayList<String>();
                loArrayList.add(hashKey);
                resultHashMap.put(originalHashMap.get(hashKey), loArrayList);
            } else {
                List<String> loArrayList = resultHashMap.get(originalHashMap
                        .get(hashKey));
                loArrayList.add(hashKey);
                resultHashMap.put(originalHashMap.get(hashKey), loArrayList);
            }
        }

        System.out.println("Original HashMap : " + originalHashMap);
        System.out.println("Result HashMap : " + resultHashMap);
    }
}
 1
Author: Madhav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-20 10:40:12

Użyj cienkiego opakowania: HMap

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class HMap<K, V> {

   private final Map<K, Map<K, V>> map;

   public HMap() {
      map = new HashMap<K, Map<K, V>>();
   }

   public HMap(final int initialCapacity) {
      map = new HashMap<K, Map<K, V>>(initialCapacity);
   }

   public boolean containsKey(final Object key) {
      return map.containsKey(key);
   }

   public V get(final Object key) {
      final Map<K, V> entry = map.get(key);
      if (entry != null)
         return entry.values().iterator().next();
      return null;
   }

   public K getKey(final Object key) {
      final Map<K, V> entry = map.get(key);
      if (entry != null)
         return entry.keySet().iterator().next();
      return null;
   }

   public V put(final K key, final V value) {
      final Map<K, V> entry = map
            .put(key, Collections.singletonMap(key, value));
      if (entry != null)
         return entry.values().iterator().next();
      return null;
   }
}
 1
Author: Jayen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-22 06:27:21

Moje 2 centy. Możesz uzyskać klucze w tablicy, a następnie zapętlić tablicę. Wpłynie to na wydajność tego bloku kodu, jeśli mapa jest dość duża, gdzie najpierw otrzymujesz klucze w tablicy, które mogą pochłonąć trochę czasu, a następnie zapętlasz. W przeciwnym razie dla mniejszych map powinno być ok.

String[] keys =  yourMap.keySet().toArray(new String[0]);

for(int i = 0 ; i < keys.length ; i++){
    //This is your key    
    String key = keys[i];

    //This is your value
    yourMap.get(key)            
}
 1
Author: Manu Bhat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-05 13:20:35

Chociaż to nie odpowiada bezpośrednio na pytanie, jest związane.

W ten sposób nie musisz ciągle tworzyć / iteracji. Wystarczy raz utworzyć odwrotną mapę i uzyskać to, czego potrzebujesz.

/**
 * Both key and value types must define equals() and hashCode() for this to work.
 * This takes into account that all keys are unique but all values may not be.
 *
 * @param map
 * @param <K>
 * @param <V>
 * @return
 */
public static <K, V> Map<V, List<K>> reverseMap(Map<K,V> map) {
    if(map == null) return null;

    Map<V, List<K>> reverseMap = new ArrayMap<>();

    for(Map.Entry<K,V> entry : map.entrySet()) {
        appendValueToMapList(reverseMap, entry.getValue(), entry.getKey());
    }

    return reverseMap;
}


/**
 * Takes into account that the list may already have values.
 * 
 * @param map
 * @param key
 * @param value
 * @param <K>
 * @param <V>
 * @return
 */
public static <K, V> Map<K, List<V>> appendValueToMapList(Map<K, List<V>> map, K key, V value) {
    if(map == null || key == null || value == null) return map;

    List<V> list = map.get(key);

    if(list == null) {
        List<V> newList = new ArrayList<>();
        newList.add(value);
        map.put(key, newList);
    }
    else {
        list.add(value);
    }

    return map;
}
 1
Author: Markymark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-01 23:22:05

W java8

map.entrySet().stream().filter(entry -> entry.getValue().equals(value))
    .forEach(entry -> System.out.println(entry.getKey()));
 0
Author: user3724331,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-10 01:53:11

Ważne jest, aby pamiętać, że od tego pytania, zbiory Apache obsługują Generic BidiMaps . Więc kilka z najlepszych głosowanych odpowiedzi nie są już dokładne w tym punkcie.

Dla Serializowanej Mapy BidiMap, która obsługuje również zduplikowane wartości (scenariusz 1 do wielu), rozważ również MapDB.org .

 0
Author: kervin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-31 16:25:49
  1. Jeśli chcesz uzyskać klucz z wartości, najlepiej użyć bidimap ( mapy dwukierunkowe), możesz uzyskać klucz z wartości w czasie O(1).

    Ale wadą tego jest to, że możesz używać tylko unikalnych zestawów kluczy i wartości.

  2. W Javie istnieje struktura danych o nazwie Table, która jest niczym innym jak mapami typu

    Tabela == Mapa >

    Tutaj możesz uzyskać map<B,C> poprzez zapytanie T.row(a);, a także możesz uzyskać map<A,C> poprzez zapytanie T.column(b);

W Twoim szczególnym przypadku, Wstaw C jako jakąś stałą.

Więc to jak ,...

Więc, jeśli znajdziesz przez T. row (a1) - - - > zwraca mapę --> get keyset tej zwróconej mapy.

Jeśli chcesz znaleźć wartość klucza, to T. column (b2) -- > zwraca mapę -- > pobiera zestaw kluczy zwracanej mapy.

Zalety w stosunku do poprzedniego przypadku:

  1. może używać wielu wartości.
  2. bardziej wydajny przy użyciu duże zbiory danych.
 0
Author: Batman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-07 15:06:25

Myślę, że keySet () może dobrze znaleźć klucze odwzorowujące wartość i mieć lepszy styl kodowania niż entrySet () .

Ex:

Załóżmy, że masz mapę HashMap , ArrayList res , A wartość chcesz znaleźć wszystkie klucze do mapowania, a następnie przechowywać klucze do res .

Możesz napisać kod poniżej:

    for (int key : map.keySet()) {
        if (map.get(key) == value) {
            res.add(key);
        }
    }

Zamiast używać entrySet() poniżej:

    for (Map.Entry s : map.entrySet()) {
        if ((int)s.getValue() == value) {
            res.add((int)s.getKey());
        }
    }

Mam nadzieję, że pomoże:)

 0
Author: FrancisGeek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-08 13:55:04