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

Foi útil?

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);
  }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top