Java中的TreeMap替代方案

时间:2015-05-07 18:22:21

标签: java

我有一个现有的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会使我现有的测试用例失败

1 个答案:

答案 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);