Existe-t-il un bon moyen d'avoir une carte < String,? & Gt; obtenir et mettre cas ignorant? [dupliquer]

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

  •  03-07-2019
  •  | 
  •  

Question

    

Cette question a déjà une réponse ici:

         

Existe-t-il un bon moyen d'avoir une mappe < Chaîne,? > une casse ignorée?

Était-ce utile?

La solution

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

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

Donc:

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

Le comparateur ne prend pas en compte les paramètres régionaux. Plus d'informations à ce sujet dans son JavaDoc.

Autres conseils

Vous pouvez utiliser CaseInsensitiveMap des Collections communes d'Apache.

Serait-il possible d'implémenter vos propres méthodes de redéfinition de map / get par carte?

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 à modifier votre " clé " tapez mais votre implémentation de la carte.

Vous avez besoin d'une classe wrapper pour votre clé String avec une implémentation de equals () et hashCode () qui ne respecte pas la casse. Utilisez-le à la place de la chaîne pour la clé de la carte.

Voir un exemple de mise en œuvre à l'adresse 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é.

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

  • Normalisez la casse avant d'utiliser une chaîne en tant que 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 langage courant pour traiter les clés composites.

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

Vous pouvez utiliser mon licence Apache CaseInsensitiveMap a fait l'objet d'une discussion ici . Contrairement à la version Apache Commons, il conserve le cas des clés. Il implémente le contrat de carte de manière plus stricte que TreeMap (plus a une meilleure sémantique concurrente) (voir les commentaires de blog pour plus de détails).

Trove4j peut utiliser un hachage personnalisé pour un HashMap. Cela peut toutefois avoir des conséquences 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 (décrits par John M) ne présentent pas ce défaut de mise en cache. Voir aussi mon autre réponse concernant TreeMap.

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

La ligne du bas est "La solution la plus simple consiste à convertir simplement toutes les entrées en majuscules (ou minuscules) avant de les insérer / vérifier. Vous pouvez même écrire votre propre wrapper de mappage pour assurer la cohérence. "

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top