我有一张树形图:
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
.
.
.
为什么这样?以及如何在第二个循环中获得排序结果?通过排序我的意思是与我在第一个循环中添加它们时的顺序相同?感谢
答案 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()
。