Est-il un bon moyen d'avoir un Map<String, ?>
get et put ignorant la casse?
Réponses
Trop de publicités?TreeMap s'étend de la Carte et prend en charge personnalisée des comparateurs.
String fournit une valeur par défaut de la casse de comparaison.
Donc:
final Map<String, ...> map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
La comparaison ne prend pas de paramètres régionaux en compte. Lire plus à ce sujet dans sa JavaDoc.
Vous pouvez utiliser CaseInsensitiveMap de Apache Commons Collections.
Serait-il possible de mettre en œuvre votre propre Carte primordial de mettre/obtenir méthodes ?
public class CaseInsensitiveMap extends HashMap<String, String> {
...
put(String key, String value) {
super.put(key.toLowerCase(), value);
}
get(String key) {
super.get(key.toLowercase());
}
}
Cette approche ne permet pas de vous forcer à changer votre clé de type" mais votre Carte de mise en œuvre.
Vous avez besoin d'une classe wrapper pour votre clé de Chaîne avec un casse equals() et hashCode() de la mise en œuvre. Au lieu d'utiliser la Chaîne de caractères pour la Carte clé.
Voir un exemple de mise en œuvre à http://www.java.happycodings.com/Java_Util_Package/code3.html je l'ai trouvé en 2 minutes de recherche sur google. Semble raisonnable pour moi, bien que je n'ai jamais utilisé.
Les trois solutions évidentes qui viennent à l'esprit:
Normaliser les cas, avant d'utiliser une Chaîne de caractères comme une clé (pas turque locale fonctionne différemment du reste du monde).
À l'aide d'un type d'objet conçu pour être utilisé en tant que clé. C'est un idiome commun pour traiter les clés composites.
Utiliser un TreeMap avec un Comparateur qui est insensible à la casse (peut-être une PRIMAIRE ou SECONDAIRE de la force de java.texte.Collateur). Malheureusement, la bibliothèque Java ne dispose pas d'un Comparateur d'équivalent pour hashCode/égale.