我的Author
对象包含name
,age
和index
字段。作者存储在HashMap中(关键是索引)。
我希望能够按姓名和年龄排序。
这开始了我想要放入我的作者类的方法,但显然我不理解这个:
public static LinkedHashMap<String, Author> sortName(Map<String, Author> unSortedMap){
Collection<Author> list = unSortedMap.values();
Collections.sort(list, new Comparator<Author>() {
public int compare(Author a, Author b) {
return a.name.compareTo(b.name);
}
});
}
因为这个而无法编译:(来自Eclipse)
The method sort(List<T>, Comparator<? super T>) in the type Collections is not applicable for the arguments (Collection<Author>, new Comparator<Author>(){})
Collections类字段是EMPTY_LIST,EMPTY_MAP和EMPTY_SET。为什么sort方法不能通过Comparator传递Map?
我认为<T>
是通用的,所以我可以传递任何我想要的对象。
我是否纠正如果这样做,Collections.sort()会按作者姓名对list
进行排序?所以我最终得到一个LinkedList<Author>
我可以变成LinkedHashMap<String, Author>
并发送它的方式?
提前谢谢你。显然我是学生。我也搜索了HOURS以获取可以指导我找到解决方案的信息。我已经阅读了每个问题:“集合排序多个值比较器”。没有什么工作。
答案 0 :(得分:3)
我不会编译,因为Collections.sort()
只排序 Lists
,而不是 Collections
。
如果要对值进行排序,可以通过将集合传递给List的构造函数来将Collection转换为List:
List<Author> list = new ArrayList<Author>(unSortedMap.values());
Collections.sort(list, new Comparator<Author>() {
public int compare(Author a, Author b) {
return a.name.compareTo(b.name);
}
});
但那不能完成任务。相反,您需要对Map
Entry
对象进行排序,然后将它们放入地图中:
public static LinkedHashMap<String, Author> sortName(Map<String, Author> unSortedMap) {
List<Map.Entry<String, Author>> list = new ArrayList<Map.Entry<String, Author>>(unSortedMap.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, Author>>() {
public int compare(Map.Entry<String, Author> a, Map.Entry<String, Author> b) {
return a.getValue().name.compareTo(b.getValue().name);
}
});
LinkedHashMap<String, Author> result = new LinkedHashMap<String, Author>();
for (Entry<String, Author> entry : list) {
result.put(entry.getKey(), entry.getValue());
}
return result;
}