web-dev-qa-db-fra.com

Existe-t-il un bon moyen d'avoir une Map <String,?> Obtenir et mettre en ignorant la casse?

Y a-t-il un bon moyen d'avoir un Map<String, ?> obtenir et mettre la casse ignorant?

61
Joshua

TreeMap étend Map et prend en charge les comparateurs personnalisés.

String fournit un comparateur insensible à la casse par défaut.

Alors:

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

Le comparateur ne prend pas en compte les paramètres régionaux. En savoir plus à ce sujet dans son JavaDoc.

62
volley

Vous pouvez utiliser CaseInsensitiveMap des collections communes d'Apache.

42
Eric Weilnau

Serait-il possible d'implémenter vos propres méthodes put/get de substitution de Map?

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 vous oblige pas à changer votre type de "clé" mais votre implémentation de carte.

31
Guido

Vous avez besoin d'une classe wrapper pour votre clé String avec une implémentation equals () et hashCode () insensible à la casse. Utilisez cela au lieu de la chaîne pour la clé de la carte.

Voir un exemple d'implémentation à http://www.Java.happycodings.com/Java_Util_Package/code3.html Je l'ai trouvé en 2 minutes de recherche sur Google. Cela me semble raisonnable, même si je ne l'ai jamais utilisé.

14
John M

Vous pouvez utiliser ma licence Apache CaseInsensitiveMap discuté ici . Contrairement à la version Apache Commons, il préserve la casse des clés. Il implémente le contrat de carte plus strictement que TreeMap (et a une meilleure sémantique simultanée) (voir les commentaires du blog pour plus de détails).

3
Glyn Normington

Les trois solutions évidentes qui me viennent à l'esprit:

  • Normaliser la casse avant d'utiliser une chaîne comme clé (les paramètres régionaux turcs ne fonctionnent pas différemment du reste du monde).

  • Utilisez un type d'objet spécial conçu pour être utilisé comme clé. C'est un idiome courant pour traiter les clés composites.

  • Utilisez un TreeMap avec un comparateur insensible à la casse (éventuellement un Java.text.Collator de force PRIMAIRE ou SECONDAIRE). Malheureusement, la bibliothèque Java) n'a pas d'équivalent Comparator pour hashCode/equals.

3

Trove4j peut utiliser un hachage personnalisé pour un HashMap. Cela peut cependant avoir des implications sur les performances étant donné que les codes de hachage ne peuvent pas être mis en cache (bien que Trove4j ait peut-être trouvé un moyen de contourner cela?). Les objets wrapper (tels que décrits par John M) ne présentent pas ce défaut de mise en cache. Voir également mon autre réponse concernant TreeMap.

0
volley

Vérifiez la réponse acceptée sur le lien ci-dessous. Comment vérifier la clé dans une carte quel que soit le cas?

En bout de ligne, "La solution la plus simple est de simplement convertir toutes les entrées en majuscules (ou minuscules) avant d'insérer/vérifier. Vous pouvez même écrire votre propre wrapper de carte qui le ferait pour assurer la cohérence."

0
Kunjan