Classificar mapa por teclas com ignorecase?
-
18-09-2019 - |
Pergunta
Bem, eu testei o TREEMAP, mas isso não leva em conta Ignorecase na comparação de string. Preciso pedir o caso lexicograficamente e ignorar. Existe alguma outra maneira?
Obrigado, isso funciona (Treemap (Comparador C)). No entanto, tenho outra pergunta:
public final Comparator<Object> STR_IGN_CASE_COMP = new Comparator<Object>() {
public int compare(Object h1, Object h2) {
String s1 = h1.getId();
String s2 = h2.getId();
return s1.compareToIgnoreCase(s2);
}
}; //STR_IGN_CASE_COMP
Como posso universalizar o comparador para trabalhar com diferentes objetos? Supondo que todos tenham o método getId ().
Obrigado, Martin
Solução
Você quer usar um Comparator
no TreeMap
construtor. Em particular, veja String.CASE_INSENSITIVE_ORDER
.
TreeMap map = new TreeMap(String.CASE_INSENSITIVE_ORDER);
Usando Collator
ou um costume Comparator
Pode funcionar melhor para você em um local não inglês ou se você precisar de pedidos mais complexos.
Outras dicas
A melhor maneira seria usar um colatador. Um colisor é uma classe incorporada, que também implementa comparável e, portanto, você pode usá -lo para o seu Treemap.
Com um colisor, você também pode controlar a força da comparação, por exemplo, se você quiser ser insensível ao sotaque.
Collator stringCollator = Collator.getInstance();
stringCollator.setStrength(Collator.PRIMARY);
new TreeMap<String, String>(stringCollator)
Forneça um comparador que compara o caso de strings ignorado.
Treemap (Comparador C)
Se você tivesse uma lista, eu diria que tente coleções.sort () com um comparador. Pode ser necessário rolar seu próprio comparador que usa string.equalsignorecase () em vez de iguais ().
public static <T> void sort(List<T> list,
Comparator<? super T> c)
Mas eu estava no caminho certo. Experimente o construtor Treemap que leva um comparador:
public TreeMap(Comparator<? super K> comparator)
Sim, o que você deseja é usar o construtor Treemap que leva um comparador. Faça um comparador que use comparetoignorecase.
Como posso universalizar o comparador para trabalhar com diferentes objetos? Supondo que todos tenham o método getId ().
Você deve poder usar um BeanComparator.
Eu suspeito que você deve construir seu TreeMap
com um comparador personalizado.
import java.text.Collator;
import java.util.Comparator;
class IgnoreCaseComp implements Comparator<String> {
Collator col;
IgnoreCaseComp() {
col = Collator.getInstance();
col.setStrength(Collator.PRIMARY);
}
public int compare(String strA, String strB) {
return col.compare(strA, strB);
}
}