【问题标题】:why does my treemap is not sorted in java?为什么我的树形图没有在 java 中排序?
【发布时间】:2018-04-11 15:03:15
【问题描述】:

我有一个树状图:

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
.
.
.

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

【问题讨论】:

    标签: java hashmap treemap


    【解决方案1】:

    TreeMap 按键而不是按值对条目进行排序。来自文档(强调我的):

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

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

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

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

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

    【讨论】:

    • 如何保留原订单?我尝试使用HashMap,但结果相似
    • 谢谢你,它有效并解释了一切,我会尽快将其标记为答案:)
    【解决方案2】:

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

    for (String data : dataMap.keySet())
    

    这会给你钥匙。

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

    查看以下示例

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      • 2019-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多