为什么我的treemap没有在java中排序?

时间:2018-04-11 15:03:15

标签: java hashmap treemap

我有一张树形图:

private Map<String, Integer> dataMap = new TreeMap<String, Integer>();

以后在代码中我有以下部分:

for (String item : data) {
    JSONObject itemJson = new JSONObject(item);
    System.out.println("-- before " + itemJson.getString("dataLabel") + " " + itemJson.getInt("dataValue"));
    dataMap.put(itemJson.getString("dataLabel"), itemJson.getInt("dataValue"));
}

for(String data : dataMap.keySet()) {
    System.out.println("-- after " + data);
}

第一个循环显示已排序的元素,例如:

-- before January 1
-- before February 2
-- before March 3
-- before April 4
.
.
.

但是第二个循环混合了顺序:

-- after April
-- after February
-- after January
-- after March
.
.
.

为什么这样?以及如何在第二个循环中获得排序结果?通过排序我的意思是与我在第一个循环中添加它们时的顺序相同?感谢

2 个答案:

答案 0 :(得分:6)

TreeMap按键排序,而不是按值排序。从文档(强调我的):

  

基于红黑树的NavigableMap实现。 地图按照其键的自然顺序排序(这是您的情况),或者在地图创建时提供的比较器,具体取决于使用的构造函数。

输出正确,因为字符串按字母顺序排序。

  

如何在第二个循环中获得排序结果?通过排序我的意思是与我在第一个循环中添加它们时的顺序相同?

请改用LinkedHashMap,因为根据插入的顺序存储条目。从文档(强调我的):

  

Map接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与HashMap的不同之处在于它维护了一个贯穿其所有条目的双向链表。 此链接列表定义迭代排序,通常是键插入映射的顺序(插入顺序)。请注意,如果将键重新插入地图中,则不会影响插入顺序。

答案 1 :(得分:0)

keySet()方法用于获取此地图中包含的键的Set视图。

for (String data : dataMap.keySet())

这会给你钥匙。

现在在该循环中,使用密钥(dataMap)从data获取每个值,然后将其打印出来。

检查以下示例

for (Map.Entry<K, V> data: dataMap.entrySet()) {
     System.out.println("Key: " + data.getKey() + ". Value: " + data.getValue());
}

HashMap没有定义其元素的任何特定顺序。因此,也没有定义“反向”顺序。

对于TreeMap,您可以使用descendingMap()