这就是我所在的地方:
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
班级。关于如何解决这个问题的任何想法?
答案 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
,则必须重新排序。