Pergunta

É aqui que estou em:

public final Comparator<Object> ID_IGN_CASE_COMP = new Comparator<Object>() {

    public int compare(Object o1, Object o2) {
        String s1 = null;
        String s2 = null;
        try {
            Class c = o1.getClass();
            IO.println(c.getName()); //java.lang.string instead of Animal
            Method method = c.getMethod("getId");
            s1 = (String)method.invoke(o1);
            s2 = (String)method.invoke(o2);
        } catch (NoSuchMethodException e) {
        } catch (IllegalAccessException e) {
        } catch (InvocationTargetException e) {}
        return s1.compareToIgnoreCase(s2);
    }
};

private Map< String, Animal> _animals = new TreeMap< String, Animal>(ID_IGN_CASE_COMP);

Estou entendendo java.lang.string ao invés de Animal classe. Alguma ideia de como posso resolver esse problema?

Foi útil?

Solução

O Treemap é ordenado em termos de suas chaves. As chaves do seu mapa são strings. Que problema você está realmente resolvendo?

Outras dicas

O mapa é baseado na ordem das teclas (não valores), de modo que explica por que você tem uma corda em vez de um animal.

Tu es quase lá, se você usar um Treeset Em vez de um TreeMap, você pode usar seu comparador em um dos campos da classe de animais.

Btw, você está usando reflexão para chegar ao campo de identificação, se o Animal Baseclass contém o .getId() Método, você pode lançar e chamar o método sem reflexão.

Se você quiser classificar um Map por valor e o atual String Key é na verdade uma propriedade de Animal, então a melhor maneira é provavelmente criar um LinkedHashMap com base em a SortedSet<Animal> ou talvez um List<Animal> que é classificado usando Collections#sort().

Set<Animal> animalSet = createAndSortItSomehow();
Map<String, Animal> animalMap = new LinkedHashMap<String, Animal>();
for (Animal animal : animalSet) {
    animalMap.put(animal.getSomeStringYouWantAsKey(), animal);
}

A única armadilha é que você precisa se reorganizar se sempre que quiser adicionar um novo Animal para o mapa.

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