我有一个现有的Map实现,它按照自然顺序对键进行排序,因为它被转换为Tree Map
1. Map <CustomInterfaceObject, Double> hashMap = service.getHashMap();
2. Map <CustomInterfaceObject, Double> treeMap = new TreeMap<CustomInterfaceObject,Double>(hashMap)
由于CustomInterfaceObject的额外实现,因为我得到了类转换异常,所以不幸的是,Tree map已成为一种痛苦。如果我的代码中第2行存在替代方案,我将不胜感激。在第2行中使用LinkedHashMap会使我现有的测试用例失败
答案 0 :(得分:1)
有两种方法可以使用TreeMap
:用于键的类型必须实现接口Comparable
,或者使用TreeMap
的构造函数来获取Comparator
{3}},您必须传递Comparator
的可以比较密钥的实现。
这是必要的,因为TreeMap
需要知道如何比较密钥,以便它可以按键对地图中的条目进行排序。
您收到ClassCastException
,因为您使用的CustomInterfaceImplemenationObject
未实现Comparable
,并且您也没有使用TreeMap
的构造函数Comparator
1}}。
第一种可能的解决方案 - 让CustomInterfaceImplemenationObject
实施Comparable<CustomInterfaceImplemenationObject>
:
public class CustomInterfaceImplemenationObject
implements CustomInterfaceObject, Comparable<CustomInterfaceImplemenationObject> {
@Override
public int compareTo(CustomInterfaceImplemenationObject other) {
// implement this as necessary, compare this and other
}
}
第二种可能的解决方案 - 将Comparator<CustomInterfaceImplemenationObject>
传递给TreeMap
的构造函数:
Comparator<CustomInterfaceImplemenationObject> comparator =
new Comparator<>() {
@Override
public int compare(CustomInterfaceImplemenationObject o1,
CustomInterfaceImplemenationObject o2) {
// implement as necessary, compare o1 and o2
}
};
Map<CustomInterfaceObject, Double> treeMap =
new TreeMap<CustomInterfaceObject,Double>(comparator);
treeMap.putAll(hashMap);