创建通用比较器以对树图问题进行排序

时间:2009-11-15 17:18:09

标签: java comparator treemap

这就是我所在的地方:

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 个答案:

答案 0 :(得分:3)

TreeMap按其键排序。你的地图的关键是字符串。你实际解决了什么问题?

答案 1 :(得分:0)

Map基于键的顺序(而不是值),这就解释了为什么你有一个String而不是Animal。

答案 2 :(得分:0)

几乎那里,如果你使用 TreeSet 而不是TreeMap,你可以在Animal类的一个字段上使用你的比较器。

顺便说一句,您使用反射来到Id字段,如果Animal基类包含.getId()方法,您可以在不反射的情况下投射和调用该方法。

答案 3 :(得分:0)

如果您想按值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,则必须重新排序。