首页 > 解决方案 > 将值从 HashMap 复制到 TreeMap

问题描述

我想将 HashMap 中的值复制到 TreeMap 以根据对象的键获取排序后的映射。

这是我的代码:

    private static Map<Product,String> sortingUsingTreeMap(Map<Product,String> descriptionByProducts){
    final Map<Product,String> sortedMap = new TreeMap<Product,String>();
    for(Map.Entry<Product, String> element:descriptionByProducts.entrySet()) {
        sortedMap.put(element.getKey(), element.getValue());
    }

    sortedMap.putAll(descriptionByProducts);
    return sortedMap;
}

我收到此错误:

Exception in thread "main" java.lang.ClassCastException: compare.Product cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1294)
at java.util.TreeMap.put(TreeMap.java:538)

这是我的“产品”模型类。地图中的键是一个产品对象。

public class Product {

private String prodId;
private String prodName;

public String getProdId() {
    return prodId;
}

@Override
public String toString() {
    return "Product [prodId=" + prodId + ", prodName=" + prodName + "]";
}

public Product(String prodId, String prodName) {
    super();
    this.prodId = prodId;
    this.prodName = prodName;
}

public void setProdId(String prodId) {
    this.prodId = prodId;
}

public String getProdName() {
    return prodName;
}

public void setProdName(String prodName) {
    this.prodName = prodName;
}
}

查看了各种答案并制作了一个自定义比较器:

import java.util.Comparator;

public class ProductComparator implements Comparator<Product>{

public ProductComparator() {
}

@Override
public int compare(Product o1, Product o2) {
    return o1.getProdId().compareTo(o2.getProdId());
}

}

如何解决此错误?提前致谢。

标签: javacollectionshashmapcomparatortreemap

解决方案


感谢@AlexITC 解决此问题。我更新了方法:

    private static Map<Product,String> sortingUsingTreeMap(Map<Product,String> descriptionByProducts){
final Map<Product,String> sortedMap = new TreeMap<Product,String>(new ProductComparator());
for(Map.Entry<Product, String> element:descriptionByProducts.entrySet()) {
    sortedMap.put(element.getKey(), element.getValue());
}

sortedMap.putAll(descriptionByProducts);
return sortedMap;

}


推荐阅读