it-swarm.com.de

HashMap <String, Integer> Nach Teil eines Schlüssels suchen?

Ich verwende derzeit HashMap<String, Integer>, der mit Schlüsseln des Typs String gefüllt ist, die alle etwa 5 Zeichen lang sind. Wie kann ich nach einem bestimmten Schlüssel von 4 Zeichen oder weniger suchen, der Teil und am Anfang einiger anderer Schlüssel ist und alle Treffer als eine Sammlung von <Key, Value> erhalten?

14
Machtl

Iterate ist Ihre einzige Option, wenn Sie keine benutzerdefinierte Datenstruktur erstellen:

for (Entry<String, Integer> e : map.entrySet()) {
    if (e.getKey().startsWith("xxxx")) {
        //add to my result list
    }
}

Wenn Sie etwas Zeiteffizienteres benötigen, benötigen Sie eine Implementierung der Karte, in der Sie diese Teilschlüssel verfolgen.

21
cyborg

Sie können dies nicht über HashMap tun, Sie sollten Ihre eigene Implementierung für Map schreiben, um eine stringlängenbasierte Suche in einer Map durchzuführen.

4
harsh

Es scheint ein Anwendungsfall für TreeMap statt HashMap zu sein. Der Unterschied ist, dass TreeMap die Reihenfolge beibehält. So können Sie Ihr partielles Spiel viel schneller finden. Sie müssen nicht die ganze Karte durchgehen.

Diese Frage überprüfen Teilsuche in HashMap

4
Ondrej Bozek
Map<String, Integer> result = new HashMap<String, Integer>;
for(String key : yourMap.keySet()) {
    if(key.length() == 4){
        result.put(key, yourMap.get(key);
    }
}

Nach Ausführung dieses Codes haben Sie alle Schlüssel/Wert-Paare mit 4 Buchstaben in result.

3
André Stannek
Set<Entry<String, Integer>> s1 = map.entrySet();
    for (Entry<String, Integer> entry : s1) {
          if(entry.getKey().length == 4)
          //add it to a map;
}

Holen Sie sich zuerst den Eintrag in Ihre Hashmap. Durchlaufen Sie den Satz und überprüfen Sie die Länge jedes Schlüssels, fügen Sie ihn einer Karte hinzu oder verwenden Sie ihn nach Belieben.

1
Adarsh

Mit HashMap<String, Integer> können Sie nur keySet() durchgehen und contains() für String-Tasten und Ihr Muster ausführen. 

0
pbespechnyi

Zum Beispiel:

public static void checkMap(Map mp) {
    Iterator it = mp.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pairs = (Map.Entry)it.next();
        System.out.println(pairs.getKey().toLowerCase().contains("YourString"))
        }
}

Dieser Code wird für diejenigen keys, die Ihre substring enthalten, als true ausgegeben.

0
Asier Aranbarri

Wie bereits erwähnt, gibt es keine äußerst effiziente * Methode, um die von Ihnen angegebene Datenstruktur auszuführen. Wenn Sie jedoch einen zusätzlichen Map<Integer, List<String>> hinzufügen, um das Mapping von der Stringlänge bis zur Liste aller Schlüssel mit dieser Länge zu verfolgen, können Sie dies sehr effizient tun.

* Wenn Sie nur Map <String, Integer> verwenden, müssen Sie die gesamte Kapazität der größeren Map durchlaufen, während Sie beim Hinzufügen dieser zusätzlichen Datenstruktur eine Suche nach O(1) (sofern Sie eine HashMap verwendet haben) erzwingen würde durch Iteration durch nur die Ergebnismenge, was das schnellste mögliche Ergebnis ist.

Sie können diesen Ansatz ausprobieren:

public Map<String,Integer> filterMap(Map<String, Integer> inputMap){
    Map<String, Integer> resultHashMap = new HashMap<String, Integer>();
        for (String key : inputMap.keySet()) {
            if(key.length()==5){
                resultHashMap.put(key,inputMap.get(key));
            }   
        }
        return resultHashMap;
    }
0
Shreyos Adikari