Zurückgeben einer Liste von Wildcard-Übereinstimmungen von einer HashMap in Java

9

Ich habe eine Hashmap, die Platzhalter (*) in der Zeichenfolge enthalten kann.

Zum Beispiel

%Vor%

kann John * als einen Schlüssel haben. Ich möchte wissen, ob JohnSmith irgendwelche Elemente in students_ übereinstimmt. Es könnte mehrere Übereinstimmungen für meine Zeichenfolge geben (John *, Jo * Smith usw.). Gibt es eine Möglichkeit, eine Liste dieser Spiele von meiner HashMap zu bekommen?

Gibt es ein anderes Objekt, das ich verwenden könnte, dass ich nicht jedes Element in meiner Sammlung durchlaufen muss, oder muss ich es saugen und ein List-Objekt verwenden?

Zu Ihrer Information: Meine Sammlung wird weniger als 200 Elemente enthalten, und letztendlich möchte ich das Paar finden, das mit der geringsten Anzahl von Platzhaltern übereinstimmt.

    
Sarah 30.09.2011, 12:57
quelle

3 Antworten

1

Das ist wegen der Hash-Funktion nicht mit einer Hasmap möglich. Es müsste den Hash von "John*" und den Hash von "John Smith" et al. der gleiche Wert.

Sie könnten es mit einer TreeMap machen, wenn Sie Ihre eigene benutzerdefinierte Klasse WildcardString winding String schreiben und compareTo so implementieren, dass "John*".compareTo("John Smith") 0 zurückgibt. Sie können dies mit regulären Ausdrücken wie andere Antworten haben bereits darauf hingewiesen.

Wenn Sie möchten, dass Sie die Liste der Widlcard-Zuordnungen möchten, können Sie die Einträge immer entfernen, wenn Sie sie finden, und iterate TreeMap.get() s. Denken Sie daran, die Schlüssel zurück zu legen, wenn Sie mit einem Namen fertig sind.

Dies ist nur ein möglicher Weg, um es zu erreichen. Mit weniger als 200 Elementen können Sie gut iterieren.

UPDATE: Um eine korrekte Reihenfolge für TreeSet festzulegen, können Sie den Fall des Vergleichs von zwei WildcardString s (dh eine Vergleiche zwischen Schlüsseln) und den Vergleich von WildcardString mit a unterscheiden String (Vergleich eines Schlüssels mit einem Suchwert).

    
Xavi López 30.09.2011, 13:02
quelle
3

Sie können Regex verwenden, um eine Übereinstimmung zu erzielen, aber Sie müssen zuerst "John*" in das Regex-Äquivalent "John.*" umwandeln, obwohl Sie dies während der Übertragung tun können.

Hier ist ein Code, der funktioniert:

%Vor%     
Bohemian 30.09.2011 13:06
quelle
0

Sie können Ihre Map einfach iterieren, ohne sie in eine Liste zu konvertieren, und die String-Match-Funktion verwenden, die einen regulären Ausdruck verwendet.

Wenn Sie die Schleife vermeiden möchten, können Sie Guava wie folgt verwenden

%Vor%

}

    
François Wauquier 30.09.2011 13:23
quelle

Tags und Links