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

ran*_*er1 0 java hashmap treemap

我有一个树形图:

private Map<String, Integer> dataMap = new TreeMap<String, Integer>();
Run Code Online (Sandbox Code Playgroud)

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

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);
}
Run Code Online (Sandbox Code Playgroud)

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

-- before January 1
-- before February 2
-- before March 3
-- before April 4
.
.
.
Run Code Online (Sandbox Code Playgroud)

但第二个循环混合顺序:

-- after April
-- after February
-- after January
-- after March
.
.
.
Run Code Online (Sandbox Code Playgroud)

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

Lui*_*oza 6

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

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

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

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

使用LinkedHashMap替代,因为根据插入的顺序存储条目.从文档(强调我的):

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