529 Stimmen

Java Hashmap: So erhalten Sie den Schlüssel vom Wert?

Wenn ich den Wert "foo" habe und eine HashMap ftw, für die ftw.containsValue("foo") true zurückgibt, wie kann ich den entsprechenden Schlüssel erhalten? Muss ich durch die HashMap schleifen? Wie ist der beste Weg, das zu tun?

1voto

Markymark Punkte 2415

Obwohl dies die Frage nicht direkt beantwortet, ist es verwandt.

Auf diese Weise müssen Sie nicht ständig erstellen/iterieren. Erstellen Sie einfach einmal eine Umkehrabbildung und holen Sie sich, was Sie benötigen.

/**
 * Sowohl Schlüssel als auch Werttypen müssen equals() und hashCode() definieren, damit dies funktioniert.
 * Hierbei wird berücksichtigt, dass alle Schlüssel eindeutig sind, aber nicht alle Werte.
 *
 * @param map
 * @param 
 * @param 
 * @return
 */
public static  Map> reverseMap(Map map) {
    if(map == null) return null;

    Map> reverseMap = new ArrayMap<>();

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

    return reverseMap;
}

/**
 * Berücksichtigt, dass die Liste bereits Werte enthalten kann.
 * 
 * @param map
 * @param key
 * @param value
 * @param 
 * @param 
 * @return
 */
public static  Map> appendValueToMapList(Map> map, K key, V value) {
    if(map == null || key == null || value == null) return map;

    List list = map.get(key);

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

    return map;
}

1voto

kanaparthikiran Punkte 507
/**
 * Diese Methode gibt den Schlüssel für den angegebenen Wert zurück
 * @param paramName
 * @return
 */
private String getKeyForValueFromMap(String paramName) {
    String keyForValue = null;
    if(paramName!=null)) {
        Set> entrySet = myMap().entrySet();
        if(entrySet!=null && entrySet.size>0) {
            for(Entry entry : entrySet) {
                if(entry!=null && paramName.equalsIgnoreCase(entry.getValue())) {
                    keyForValue = entry.getKey();
                }
            }
        }
    }
    return keyForValue;
}

1voto

Manu Bhat Punkte 125

Mein Senf. Sie können die Schlüssel in einem Array erhalten und dann durch das Array iterieren. Dies wird die Leistung dieses Codeblocks beeinträchtigen, wenn die Map ziemlich groß ist, da Sie zuerst die Schlüssel in einem Array erhalten, was einige Zeit in Anspruch nehmen kann, und dann iterieren. Andernfalls sollte es für kleinere Maps in Ordnung sein.

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

for(int i = 0 ; i < keys.length ; i++){
    //Dies ist Ihr Schlüssel    
    String key = keys[i];

    //Dies ist Ihr Wert
    yourMap.get(key)            
}

0 Stimmen

Und warum sollte jemand diesen Ansatz verwenden? Wie Sie bereits gesagt haben, wäre die Leistung schlechter als bei anderen Ansätzen.

1voto

Kanagavelu Sugumar Punkte 17711
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

public class ValueKeysMap extends HashMap {
    HashMap> ValueKeysMap = new HashMap>();

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

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

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

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

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

    /*
     * Achten Sie auf den Konstruktor mit Argumenten und andere APIs wie putAll
     */
}

1voto

Madhav Punkte 19
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> resultHashMap = new HashMap>();

        Set newKeyList = resultHashMap.keySet();

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

            if (!newKeyList.contains(originalHashMap.get(hashKey))) {
                List loArrayList = new ArrayList();
                loArrayList.add(hashKey);
                resultHashMap.put(originalHashMap.get(hashKey), loArrayList);
            } else {
                List 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);
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X