有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java按值排序树形图

我想按特定的客户属性对客户对象的树状图进行排序。 树状图的定义如下:

private TreeMap<Long,Customer> customerMap = new TreeMap<>();

Long是存储的客户ID的类型

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

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.

}

这不起作用并抛出:无法推断TreeMap的类型参数<>;2号线的爪哇(16778094)

也许,问题在于,比较器需要<;地图进入<;K、 V>>;比较树形图<;K、 V>;这就是问题所在

我该如何解决这个问题,以按值排序,但保持customerMap类型不变

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


共 (2) 个答案

  1. # 1 楼答案

    这对于流来说相当容易:

    Customer[] cust =
        customerMap.values()
                   .stream()
                   .sorted(Comparator.comparing(Customer::getName))
                   .toArray(Customer[]::new);
    

    您只需要根据您的示例对进行排序,那么为什么要麻烦将TreeMap反向排序,而您唯一关心的是已排序(按名称)Customer[]

  2. # 2 楼答案

    设置第二个树状图,使用客户的姓氏作为键:

    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()] );
    '''