【问题标题】:Adding Integers to HashMap将整数添加到 HashMap
【发布时间】:2012-09-03 00:52:42
【问题描述】:

我有一个HashMap,我正在向其中添加数组中的整数。键是整数,值是整数的重复数。当我遍历HashMap 以获取HashMap 中的键时,它们似乎是随机顺序的。添加这些键是否有任何特定顺序?这就是我迭代的方式。

       Set<String> a = names.keySet();
        Iterator i = a.iterator();

        while(i.hasNext())
            String t = (String) i.next();

【问题讨论】:

    标签: java iterator hashmap


    【解决方案1】:

    确实,HashMap 以不确定(不可预测/不可靠)的顺序返回条目。如果您希望条目按键顺序显示(因此,23 之前),请使用TreeMap (javadoc)。如果您希望条目按初始插入顺序显示,请使用LinkedHashMap (javadoc)。


    编辑添加:你说“关键是整数”,但是你到处使用String。请注意,字符串"123" 将在字符串"23" 之前排序,就像"abc" 将在"bc" 之前排序一样。如果您希望您的密钥被视为数字,例如通过按数字顺序排序,那么您应该使用数字类型,例如Integer,而不是String。 (技术上可以为您的TreeMap 提供一个Comparator&lt;String&gt;,通过检查其内容并进行整数比较来比较字符串值键,但我认为您不想这样做。)

    【讨论】:

    • 我观察到使用 LinkedHashMap 按给定顺序存储键。我尝试使用 TreeMap 并没有完全按排序顺序返回键。能举个例子吗?
    • @RaghavShankar TreeMap 将保证键是按字典顺序升序的,因为这是String.compareTo 强加的顺序。
    • @RaghavShankar:正如 veer 所说。我已经编辑了我的答案来解释这一点。
    【解决方案2】:

    来自JavaDocs

    这个类(HashMap)不保证映射的顺序;在 特别是,它不保证订单将保持不变 随着时间的推移

    如果您希望它们按“自然顺序”排列,可以使用 SortedMap

    如果您希望 Iterator 按添加顺序返回密钥,您可以改为 LinkedHashMap

    这个链表定义了迭代顺序,通常是 将键插入映射的顺序(插入顺序)

    【讨论】:

    • LinkedHashMap 也支持访问排序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多