将值从 HashMap 复制到 TreeMap

Copy values from a HashMap to 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)

这是我的 "Product" 模型 class。地图中的键是一个产品对象。

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());
}

}

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

感谢@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;

}

一般的解决方案是将 implements Comparator<Product> 添加到产品 class,并在 class 中包含比较方法。有了这个,您可以在任何需要比较器的地方使用 Product 而无需指定它。