【问题标题】:Change iteration order for a Map更改地图的迭代顺序
【发布时间】:2019-10-18 11:25:21
【问题描述】:

如何以特定的所需顺序迭代 Map? 我目前有一个 HashMap 并且希望能够定义一个特定的迭代顺序。用户应该可以更改订单。

我的第一个想法是使用 LinkedHashMap,因为它会给我一个条目的顺序,但遗憾的是,实现只按插入顺序或访问顺序对它们进行排序。除了使用删除操作插入顺序之外,我认为 LinkedHashMap 不适合该任务。 Imo 的实现方式与文档所说的有所不同。

我还找到了 SortedMap,但它使用了一个比较器,所以每次我想遍历条目时都需要评估它。这可能是一个解决方案,但有点昂贵:O(n*log(n))。

到目前为止,Andreas 的评论似乎是最好的解决方案,它同时具有 HashMap 和 ArrayList。

【问题讨论】:

  • “有没有更简单的方法?” 没有,除了可能建立一个新列表,无需从旧列表中单独删除项目。
  • 如果您想控制订单,请使用单独的List(数组、链接等)和直接的HashMap。将它们包装在一个使它们保持同步的类中可能会很好。
  • 是的,LinkHashMap 可能不是您所需要的。
  • 您知道它们总是按插入顺序放入其中。没有“通常”。
  • 澄清一下:“可预测的迭代顺序”措辞是因为LinkedHashMap 支持 2 个(并且仅 2 个)迭代顺序。默认(又名最常用,又名“通常”使用)顺序是 insertion-order,另一个是 access-order。该类不支持任何其他迭代排序。

标签: java dictionary iteration linkedhashmap


【解决方案1】:

将 LinkedHashMap 转换为 ArrayList,然后切换值。然后转换回 LinkedHashMap。 O(n) 的空间和时间复杂度。

【讨论】:

  • 这可行,但在我看来过于复杂。
  • 因为LinkedHashMap内部使用LinkedList,所以按索引切换item并不是一个好主意。我认为如果可能的话,你可以实现一个带有 ArrayList 键的 HashMap 来做到这一点。
  • 如果您想使用自定义的条目顺序,我认为 SortedMap 将是您的解决方案,TreeMap 是 SortedMap 的实现,可以编写您自己的比较器。
【解决方案2】:

这个问题的正确答案是你使用了不正确的数据结构,你不必重新排序。

【讨论】:

  • 正确的数据结构是什么?我需要一个 Map,它还可以让我按照我想要的顺序遍历条目。
【解决方案3】:

如果你想要一个键值对并且你希望它具有 ArrayList 的属性,那么你可以试试

List<Pair<String, String>> ?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2016-01-18
    相关资源
    最近更新 更多