Gibt es eine gute Möglichkeit, eine Karte haben Erhalten und stellt Fall zu ignorieren? [Duplikat]

StackOverflow https://stackoverflow.com/questions/212562

  •  03-07-2019
  •  | 
  •  

Frage

    

Diese Frage bereits eine Antwort hier:

         

Gibt es eine gute Möglichkeit, ein Map<String, ?> zu haben und Fall gesetzt bekommen zu ignorieren?

War es hilfreich?

Lösung

TreeMap erstreckt Karte und unterstützt benutzerdefinierte Komparatoren.

String stellt eine Standard Groß- und Kleinschreibung Komparator.

So:

final Map<String, ...> map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);

Der Komparator nimmt nicht locale berücksichtigt. Lesen Sie mehr darüber in der JavaDoc.

Andere Tipps

Sie könnten a href = verwenden < "http://commons.apache.org/proper/commons-collections/javadocs/api-release/org/apache/commons/collections4/map/CaseInsensitiveMap.html" rel =“ noreferrer "> CaseInsensitiveMap von Apache Commons Sammlungen.

Wäre es möglich, Ihre eigene Karte überschrieben put zu implementieren / Methoden erhalten?

public class CaseInsensitiveMap extends HashMap<String, String> {
    ...
    put(String key, String value) {
       super.put(key.toLowerCase(), value);
    }

    get(String key) {
       super.get(key.toLowercase());
    }
}

Dieser Ansatz, den Sie nicht zwingen, Ihren Typ „Schlüssel“ zu ändern, aber Ihre Map-Implementierung.

Sie benötigen eine Wrapper-Klasse für Ihren String-Schlüssel mit Groß- und Kleinschreibung equals () und hashCode () -Implementierung. Verwenden Sie, dass anstelle der String für die Karte des Taste.

Sehen Sie eine Beispielimplementierung unter http://www.java.happycodings.com/ Java_Util_Package / code3.html ich fand es in 2 Minuten googeln. Sieht vernünftig zu mir, obwohl ich es nie benutzt habe.

Die drei offensichtliche Lösungen, die in den Sinn kommen:

  • den Fall normalisieren, bevor Sie einen String als Schlüssel (nicht Türkisch locale funktioniert anders als der Rest der Welt) verwendet wird.

  • Verwenden Sie eine spezielle Objekttyp entworfen als Schlüssel verwendet werden. Dies ist ein gemeinsames Idiom mit zusammengesetzten Schlüsseln für den Umgang.

  • Verwenden Sie einen TreeMap mit einem Komparator, die Groß- und Kleinschreibung (möglicherweise ein primäres oder sekundäres Stärke java.text.Collator) ist. Leider ist die Java-Bibliothek nicht einen Komparator Äquivalent für haben hashCode / entspricht.

Sie könnten mein Apache Lizenz CaseInsensitiveMap diskutiert hier . Anders als bei der Apache Commons Version, bewahrt es den Fall von Schlüsseln. Es implementiert die Karte Vertrag strenger als TreeMap (plus hat eine bessere gleichzeitige Semantik) (die Blog-Kommentare für Details).

Trove4j können benutzerdefinierte verwenden für eine HashMap Hashing. Dies kann jedoch Auswirkungen auf die Leistung haben angegeben, dass Hashcodes kann nicht zwischengespeichert werden (obwohl Trove4j einen Weg, um dieses gefunden haben?). Wrapper-Objekte (wie von John M beschrieben) nicht über diesen Caching-Mangel. Siehe auch meine andere Antwort in Bezug auf TreeMap.

Überprüfen Sie die akzeptierte Antwort auf den Link unten. Wie für Schlüssel in einer Karte überprüfen unabhängig von dem Fall?

Unterm Strich ist „Die einfachste Lösung, um alle Eingaben in Großbuchstaben zu konvertieren einfach ist (oder klein geschrieben) vor dem Einsetzen / Überprüfen. Sie können sogar Ihren eigenen Map-Wrapper schreiben, die diese Konsistenz sicherzustellen tun würden.“

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top