如何将HashMap转换为TreeMap

时间:2017-03-16 17:51:25

标签: java hashmap treemap

这个问题似乎非常受欢迎,但我无法为我的实施获得正确的结果。我以thread为例,但到目前为止还没有运气。

在这里,我需要转换为TreeMap的HashMap,以便对键值进行排序:

HasMap<String, HashMap<String, SomeBean>> hashMap = (HashMap<String, HashMap<String, SomeBean>>)request.getAttribute("HASHMAP");

应用迭代器后,我可以按未排序的顺序看到结果。

现在我想将其转换为TreeMap:

TreeMap<String, TreeMap<String, SomeBean>> treeMap = new TreeMap<String, TreeMap<String, SomeBean>>(hashMap);

结果:

The constructor TreeMap<String,TreeMap<String,SomeBean>>(HashMap<String,HashMap<String,SomeBean>>) is undefined

好吧,看起来因为我已经使用我的bean类嵌套了地图,所以它不允许我创建新的树图。这是可以理解的,因为我不希望TreeMap具有适合我标准的构造函数,但问题是如何找到此问题的解决方法?

2 个答案:

答案 0 :(得分:0)

如果您的代码使用嵌套地图作为常规Map,即它不使用HashMapTreeMap中定义的任何特定方法,您可以定义您的类型参数变量使用Map代替:

HashMap<String, Map<String, SomeBean>> hashMap =
    (HashMap<String, Map<String, SomeBean>>) request.getAttribute("HASHMAP");

TreeMap<String, Map<String, SomeBean>> treeMap =
    new TreeMap<String, Map<String, SomeBean>>(hashMap);

否则,您将无法使用constructor(Map)putAll(Map),而且您必须手动填写treeMap

答案 1 :(得分:0)

由于您的地图具有不兼容的值类型,因此您需要手动转换它们:

    Map<String, Map<String, SomeBean>> treeMap = new TreeMap<>();
    for (Map.Entry<String, HashMap<String, Integer>> e : hashMap.entrySet())
        treeMap.put(e.getKey(), new TreeMap<>(e.getValue()));