【问题标题】:How to sort hashmap? [closed]如何对哈希图进行排序? [关闭]
【发布时间】:2010-01-03 04:01:22
【问题描述】:

我有 hashmap,它的键就像“folder/1.txt,folder/2.txt,folder/3.txt”,值有这些文本文件数据。

现在我被困住了。我想对这个列表进行排序。但它不允许我这样做:( 这是我的 hashmap 数据类型:

HashMap<String, ArrayList<String>> 

以下函数运行良好,但它适用于 arraylist 而不是 hashmap。

Collections.sort(values, Collections.reverseOrder());

我也尝试了 MapTree,但它也没有工作,或者可能是我无法让它工作。我用了 以下步骤使用 maptree 对代码进行排序

HashMap testMap = new HashMap();
Map sortedMap = new TreeMap(testMap);

还有其他方法吗??

我有一个疑问,因为我的密钥是 (folder/1.txt, folder/2.txt) 可能是这个原因?

【问题讨论】:

  • 是对Map Strings进行排序,还是对Strings的每个值列表进行排序?
  • -1 - 这个问题难以理解。所有尝试的答案都是猜测问题的真正含义。
  • 斯蒂芬你说得对,我们都在猜测!
  • 哈哈,这可能是我们的第一个错误。

标签: java hashmap


【解决方案1】:

我猜你想要对键列表进行排序。

如果你的 hashmap 被称为 h,那么试试这个:

SortedSet<String> sortedKeys = new TreeSet<String>(h.keySet());

【讨论】:

  • 谢谢,成功了!对不起,如果我的问题让你们猜到了!
  • (-1)你不能 new SortedSet(),它是一个接口。应该类似于 sortedKeys = new TreeSet(h.keySet());
  • RealHowTo -- 谢谢。你是对的。我已经确定了答案。
  • 当然你可以“新建”一个接口——这只是意味着你必须提供整个实现。
【解决方案2】:

为什么不这样做呢?

Map<String, ValueObject> testMap = new TreeMap<String, ValueObject>();

其中ValueObject 是您用于值的任何类。

编辑:这是基于一些假设——等待获得更多信息以了解 OP 真正需要什么。

【讨论】:

  • 我确实读过这篇文章——他没有明确说明他是要根据键还是值进行排序。他也没有说键是字符串还是文件。所以我假设他想根据字符串键进行排序,这将使用 TreeMap 自动进行,他应该只使用它而不是 HashMap。
【解决方案3】:

使用 TreeMap,并为文件夹路径实现 Comparator 接口。

比较器应该根据您想要的规则比较两个键,并将该比较器传递给 TreeMap 的构造函数。如果按纯字母规则排序是可以的,那么你可以跳过这一步。如果您想对路径做一些特别的事情,那么您需要定义比较器中的内容。

【讨论】:

  • 树形图对而不是元素进行排序!
  • 为什么要对值进行排序?这没有任何意义。
  • 你先写了“元素”。现在听起来不错,但在您再次编辑之前,我不会让我取消投票!
【解决方案4】:

我相信 HashMap 在您遍历键时不保证任何顺序。迭代顺序取决于桶和碰撞。

您可能希望将值放入其他集合中,然后对其进行排序。

【讨论】:

  • HashMaps 不保证键的顺序。根据java.sun.com/javase/6/docs/api/java/util/HashMap.html“这个类不保证地图的顺序;特别是,它不保证顺序会随着时间的推移保持不变。”
  • 对于 HashMap 本身是正确的,但请看一下 LinkedHashMap(它扩展了 HashMap)。它保证键的顺序就像它们被插入一样。
【解决方案5】:

我的第一个猜测是使用 File 对象而不是 String 对象作为键。但后来我注意到您说您的密钥是"folder/1.txt,folder/2.txt,folder/3.txt",而您的值是Collection&lt;Strings&gt; 类型。如果是这样,也许你的解决方案应该是

map.put("folder/1.txt", ...);
map.put("folder/2.txt", ...);
map.put("folder/3.txt", ...);

而不是

map.put("folder/1.txt,folder/2.txt,folder/3.txt", new ArrayList(...));

按照您的尝试使用TreeMap 对单个文件进行排序。

【讨论】:

  • 他说他的钥匙是字符串...
  • 但他似乎使用逗号分隔的文件名作为键,所以我编辑了我的帖子以进行另一个猜测。请删除反对票。
  • 当然,我们会看看他是否澄清了他到底在做什么:)
【解决方案6】:

有时我使用 LinkedHashMap,当调用 keySet() 时,它会以排序方式返回项目,因为你通过 put() 添加到地图中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2014-05-30
    相关资源
    最近更新 更多