C'è un buon modo per avere una mappa < String,? & Gt; ottenere e mettere ignorando caso? [duplicare]

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

  •  03-07-2019
  •  | 
  •  

Domanda

    

Questa domanda ha già una risposta qui:

         

C'è un buon modo per avere una Map < String,? > ottenere e mettere il caso da ignorare?

È stato utile?

Soluzione

TreeMap estende Map e supporta comparatori personalizzati.

String fornisce un comparatore senza distinzione tra maiuscole e minuscole predefinito.

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

Il comparatore non tiene conto delle impostazioni internazionali. Ulteriori informazioni al riguardo nel suo JavaDoc.

Altri suggerimenti

Potresti usare CaseInsensitiveMap dalle collezioni Commons di Apache.

Sarebbe possibile implementare la propria mappa ignorando i metodi put / get?

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

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

Questo approccio non ti obbliga a cambiare la tua "chiave" digitare ma l'implementazione della mappa.

È necessaria una classe wrapper per la chiave String con un'implementazione equals () e hashCode () senza distinzione tra maiuscole e minuscole. Usa quello invece della stringa per la chiave della mappa.

Guarda un'implementazione di esempio in http://www.java.happycodings.com/ Java_Util_Package / code3.html l'ho trovato in 2 minuti di google. Mi sembra sensato, anche se non l'ho mai usato.

Le tre soluzioni ovvie che mi vengono in mente:

  • Normalizza il caso prima di usare una stringa come chiave (non le impostazioni locali turche funzionano in modo diverso dal resto del mondo).

  • Usa un tipo di oggetto speciale progettato per essere usato come chiave. Questo è un linguaggio comune per gestire le chiavi composite.

  • Usa una TreeMap con un Comparatore senza distinzione tra maiuscole e minuscole (possibilmente un java.text.Collator PRIMARY o SECONDARY). Sfortunatamente la libreria Java non ha un equivalente Comparatore per hashCode / equals.

Potresti usare la mia licenza Apache CaseInsensitiveMap discusso qui . A differenza della versione di Apache Commons, conserva il caso delle chiavi. Implementa il contratto cartografico più rigorosamente di TreeMap (inoltre ha una semantica simultanea migliore) (vedi i commenti sul blog per i dettagli).

Trove4j può utilizzare hashing personalizzato per un HashMap. Ciò può tuttavia avere implicazioni in termini di prestazioni, dato che gli hashcode non possono essere memorizzati nella cache (sebbene Trove4j possa aver trovato un modo per aggirare questo?). Gli oggetti wrapper (come descritto da John M) non presentano questo difetto di memorizzazione nella cache. Vedi anche la mia altra risposta riguardo TreeMap.

Controlla la risposta accettata al seguente link. Come controllare la chiave in una mappa indipendentemente dal caso?

La linea di fondo è " La soluzione più semplice è semplicemente convertire tutti gli input in maiuscolo (o minuscolo) prima di inserire / verificare. Potresti anche scrivere il tuo wrapper Mappa che farebbe questo per garantire coerenza. & Quot;

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top