Pergunta

Esta questão já tem uma resposta aqui:

Existe uma boa maneira de ter um get Map<String, ?> e colocar ignorando caso?

Foi útil?

Solução

TreeMap estende Mapa e suporta comparadores personalizados.

Cordas fornece um comparador insensível caso padrão.

Assim:

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

O comparador não leva local em consideração. Leia mais sobre ele em seu JavaDoc.

Outras dicas

Você pode usar CaseInsensitiveMap de Apache Commons Collections.

Seria possível implementar seu próprio Mapa substituindo put / get métodos?

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

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

Esta abordagem não forçá-lo a mudar o seu tipo "chave", mas sua implementação Mapa. ??

Você precisa de uma classe wrapper para sua chave corda com um maiúsculas e minúsculas equals () e implementação hashCode (). Use que ao invés da cadeia para a chave do mapa.

Veja um exemplo de implementação em http://www.java.happycodings.com/ Java_Util_Package / code3.html eu achei em 2 minutos de pesquisando. Looks sensatas para mim, embora eu nunca usei.

As três soluções óbvias que vêm à mente:

  • Normalize o caso antes de usar uma String como uma chave (não idioma turco funciona de forma diferente do resto do mundo).

  • Use um tipo especial de objeto projetado para ser usado como chave. Este é um idioma comum para lidar com chaves compostas.

  • Use um TreeMap com um comparador que é maiúsculas e minúsculas (possivelmente uma força java.text.Collator primária ou secundária). Infelizmente a biblioteca Java não tem um equivalente Comparador para hashCode / iguais.

Você pode usar o meu Apache licenciado CaseInsensitiveMap discutido aqui . Ao contrário da versão do Apache Commons, preserva o caso das chaves. Ele implementa o contrato mapa mais rigorosa do que TreeMap (mais tem semântica melhor simultâneos) (veja os comentários do blog para detalhes).

Trove4j pode usar hash personalizado para um HashMap. Isto pode no entanto ter implicações de desempenho, dado que hashcodes não pode ser armazenada em cache (embora Trove4j podem ter encontrado uma maneira de contornar isso?). objetos de mensagens publicitárias (como descrito por John M) não têm essa deficiência cache. ver também a minha outra resposta sobre TreeMap.

Verifique a resposta aceita no link abaixo. Como verificar a chave em um mapa independentemente do caso?

A linha inferior é "A solução mais simples é simplesmente converter todas as entradas para maiúsculas (ou minúsculas) antes de inserir / verificação. Você pode até escrever o seu próprio mapa de invólucro que faria isso para garantir a consistência."

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top