【问题标题】:Iterating through LinkedHashMap Values Isn't Ordered?遍历 LinkedHashMap 值不是有序的?
【发布时间】:2016-01-13 22:39:09
【问题描述】:

对于我用 Java 设计的问题,我会得到一个日期列表和中奖号码。我应该和他们一起做事,然后按顺序把他们吐出来。我决定选择一个LinkedHashMap来解决,Date包含日期,int[]包含中奖号码数组。

问题是,当我运行 .values() 函数时,我注意到数字不再是有序的(通过插入)。我正在运行的代码是:

    for(int i = 0; i < 30; i++){ //testing first 30 to see if ordered
        System.out.println(Arrays.toString((int [])(winningNumbers.values().toArray()[i])));
    }   

谁能看到我到底做错了什么?几乎只想使用 .get() 并遍历日期,因为日期确实按某种顺序排列,但这可能会使使用 LinkedHashMap 毫无意义。在这种情况下,不妨使用二维 ArrayList[][]。提前致谢!

编辑:添加代码以供进一步检查!

彩票类:http://pastebin.com/9ezF5U7e 文本文件:http://pastebin.com/iD8jm7f8

要进行测试,请调用 checkOldLTNums()。只需将任何 int[] 数组传递给它,它不会使用它,至少与这个问题有关。输出与 .txt 中的第一行不同,这是有组织的。谢谢!

编辑2:

我想我知道为什么它失败了。我使用了一个较小的 .txt 文件,并且代码运行良好。将 1900 个条目加载到内存中可能是不明智的。我想最好只加载单独的行并比较它们,而不是一次抓取所有内容。这个逻辑合理吗?从这里得到的任何建议都会很有用。

【问题讨论】:

    标签: java arrays linkedhashmap key-value-store toarray


    【解决方案1】:

    values() 方法将返回 Map 的值按照它们插入的顺序,这就是 ordered 的意思,不要将其与排序,这意味着不同的事情 - 项目遵循由值的 Comparator 定义的顺序,或者如果没有提供比较器,则遵循其自然顺序。

    也许你最好使用SortedMap 来保持项目按键排序。总结一下:LinkedHashMap有序TreeMap有序

    【讨论】:

    • 我很抱歉,我应该更加小心我的措辞。我的问题是,无论如何,它们的出现顺序与插入的顺序不同。 .values() 正在生成我的地图的随机排序,而不是按插入顺序。
    • @Luiserebii 尝试使用entrySet()keySet() 迭代Map
    • 嗯,刚刚检查了keySet,键也没有插入顺序。关于为什么会发生这种情况的任何想法?我应该在某处上传我的代码吗?
    • 唯一可能的解释是您实际上并没有使用 LinkedHashMap,因为您描述的行为与类契约不对应。检查您正在实例化 LinkedHashMap 的部分,确保您没有将数据复制到不同的 Map 等。
    • 嗯,这是我的实例化: MapwinningNumbers = new LinkedHashMap();
    【解决方案2】:

    尝试改用TreeMap。您应该以这种方式按升序键顺序获取值。

    【讨论】:

      【解决方案3】:

      我不敢相信我错过了这个。我做了更多的故障排除,并意识到一些日期键正在替换其他键。在做了一些测试后,我终于意识到我使用的格式是关闭的:“dd/MM/yyyy”而不是“MM/dd/yyyy”。这就是我复制粘贴所得到的,哈哈。感谢所有帮助过的人!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-02
        • 1970-01-01
        • 1970-01-01
        • 2012-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多