Создание универсального компаратора для сортировки задачи о древовидной карте - PullRequest
1 голос
/ 15 ноября 2009

Вот где я нахожусь:

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);

Я получаю java.lang.string вместо Animal класса. Есть идеи, как решить эту проблему?

Ответы [ 4 ]

3 голосов
/ 15 ноября 2009

TreeMap упорядочен по ключам. Ключи вашей карты - Строки. Какую проблему вы на самом деле решаете?

0 голосов
/ 15 ноября 2009

Если вы хотите отсортировать Map по значению, а текущий ключ String на самом деле является свойством Animal, тогда, вероятно, лучше всего создать LinkedHashMap на основе SortedSet<Animal> или, возможно, List<Animal>, который отсортирован по Collections#sort().

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

Единственный недостаток в том, что вам нужно пересортировать, если вы хотите добавить новый Animal на карту.

0 голосов
/ 15 ноября 2009

Вы там почти . Если вы используете TreeSet вместо TreeMap, вы можете использовать свой компаратор в одном из полей класса Animal.

Кстати, вы используете отражение, чтобы добраться до поля Id, если базовый класс Animal содержит метод .getId(), вы можете привести и вызвать метод без отражения.

0 голосов
/ 15 ноября 2009

Карта основана на упорядочении ключей (не значений), поэтому это объясняет, почему у вас есть строка вместо животного.

...