【问题标题】:Copy values from a HashMap to TreeMap [closed]将值从 HashMap 复制到 TreeMap [关闭]
【发布时间】:2019-12-29 07:11:45
【问题描述】:

我想将HashMap中的一个值复制到TreeMap中,根据对象的Keys得到排序后的映射。

这是我的代码:

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

}

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

【问题讨论】:

  • 使用接收比较器的TreeMap构造函数,例如new TreeMap&lt;Product,String&gt;(new ProductComparator());

标签: java collections hashmap comparator treemap


【解决方案1】:

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

}

【讨论】:

  • FYI #1: for 循环和 putAll 做同样的事情。删除循环。
  • FYI #2: 如果 Product 实现了 Comparable&lt;Product&gt; 并且您将代码从 compare 方法移动到 Product 中的 compareTo 方法,那么您的可以使用复制构造函数在一行中完成地图的复制:sortedMap = new TreeMap&lt;&gt;(descriptionByProducts)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-29
    • 2011-01-27
    • 2020-03-18
    • 2013-10-31
    • 2011-10-26
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    相关资源
    最近更新 更多