将值从 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 而无需指定它。
我想从 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 而无需指定它。