首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按值排序TreeMaps

按值排序TreeMaps
EN

Stack Overflow用户
提问于 2021-02-19 19:34:22
回答 2查看 284关注 0票数 0

我希望根据特定的Customer属性对Customer对象的TreeMap进行排序。TreeMap的定义如下:

代码语言:javascript
复制
private TreeMap<Long,Customer> customerMap = new TreeMap<>();

Long是存储的客户的ID类型。

我编写了一个函数来创建一个新的TreeMap,并将一个比较器传递给它的构造函数,该构造函数获取比较特定字段的映射条目及其值。

代码语言:javascript
复制
public Customer[] getCustomersByName() {
    TreeMap<Long,Customer> sortByName = new TreeMap<> (

        new Comparator<Map.Entry<Long,Customer>>() {
            @Override public int compare(Map.Entry<Long,Customer> cus1, Map.Entry<Long,Customer> cus2) {
                return cus1.getValue().getLastName().compareTo(cus2.getValue().getLastName());
            }
        }
    );
    sortByName.putAll(customerMap);
    
    // sortByName to Customer[] and return.

}

这不起作用,并抛出:无法在第2行推断TreeMap<>Java(16778094)的类型参数。

也许,问题是比较器采用>来比较TreeMap,这就是问题所在。

我如何修正这个问题,以便按值进行排序,但保持customerMap类型不变?

我知道TreeMaps只按键排序。这个工作是否有一个更好的数据结构,这样我就可以存储一堆客户对象,并根据不同的客户属性对它们进行排序,而不需要太昂贵的操作(最好不是多项式)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-19 20:21:25

设置第二个TreeMap,使用客户姓作为密钥:

代码语言:javascript
复制
TreeMap<String,Customer> sortByName  = new TreeMap<>();
TreeMap<Long,Customer> sortByID = new TreeMap<>();
----------------
sortByName.put(customer.getLastName(), customer);
sortByID.put(new Long(customer.getID()), customer);
----------------
return sortByName.values().toArray( new Customer[sortByName.size()] );
'''
票数 0
EN

Stack Overflow用户

发布于 2021-02-19 20:24:08

对于流来说,这相当容易:

代码语言:javascript
复制
Customer[] cust =
    customerMap.values()
               .stream()
               .sorted(Comparator.comparing(Customer::getName))
               .toArray(Customer[]::new);

您只需要根据示例对值进行排序,那么为什么要对TreeMap进行反向排序,因为您只关心一个排序(按名称)的Customer[]

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66283947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档