使用比较器对具有多个字段的对象的地图进行排序

时间:2014-04-12 03:25:17

标签: java sorting collections comparator

我的Author对象包含nameageindex字段。作者存储在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>(){})

  1. Collections类字段是EMPTY_LIST,EMPTY_MAP和EMPTY_SET。为什么sort方法不能通过Comparator传递Map?

  2. 我认为<T>是通用的,所以我可以传递任何我想要的对象。

  3. 我是否纠正如果这样做,Collections.sort()会按作者姓名对list进行排序?所以我最终得到一个LinkedList<Author>我可以变成LinkedHashMap<String, Author>并发送它的方式?

  4. 提前谢谢你。显然我是学生。我也搜索了HOURS以获取可以指导我找到解决方案的信息。我已经阅读了每个问题:“集合排序多个值比较器”。没有什么工作。

1 个答案:

答案 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;
}