【问题标题】:implementing iterator with iterable to Hashmap - is it possible?使用可迭代到 Hashmap 实现迭代器 - 有可能吗?
【发布时间】:2014-11-29 03:45:37
【问题描述】:

如果不保留顺序,我如何为 Hashmap 创建一个迭代器(通过实现可迭代)? 我的键应该是有序的..我想按降序迭代

【问题讨论】:

  • 您可以遍历条目集。
  • Iterator 本身并没有说明顺序,它只是遍历集合的元素。
  • 请记住,哈希表通过不保持键顺序来实现其速度;如果您想订购,请使用 TreeMap 或类似的东西
  • 我尝试使用树图.. 但它没有 get(index) 方法
  • @Shiran Map 没有 get(index) 方法。

标签: java hashmap iterable


【解决方案1】:

也许可以使用TreeMap

地图根据其键的自然顺序进行排序

另外,来自TreeMap.keySet() 文档:

返回此映射中包含的键的 Set 视图。集合的迭代器按升序

返回键

迭代示例:

TreeMap<K,V> tree;
// ...
for (final String key : tree.keySet()) {
    final V value = tree.get(key);
}

【讨论】:

  • 如果没有get(index)方法,如何迭代?
  • 你确实有一个get()
  • 我是否将密钥设置为 Set?是有序集合吗?
  • @Shiran 这就是我在答案中复制的TreeMap.keySet() 摘录所说的。
  • 我想实现可迭代接口。声明会是“私有类 myIterator 实现 Iterator”吗?
【解决方案2】:

HashMap 确实不保留插入顺序。但是,您可能会使用 Javadoc 中提到的 LinkedHashMap(部分)

Map 接口的哈希表和链表实现,具有可预测的迭代顺序。

【讨论】:

  • @Shiran 正确(如HashMap)它有get(Object key)。你的问题是HashMap,而不是List
  • 所以基本上它的链表实现相同,只是使用get(对象键)?
  • 第一个 Javadoc 链接中的第二句话说 此实现与 HashMap 的不同之处在于它维护一个贯穿其所有条目的双向链表。 还有一个 @ 987654323@(按key排序)。
【解决方案3】:

您可以将 HashMap 中的条目复制到保留顺序的集合(如 List),然后根据键对它们进行排序(以相反的顺序)。你说你想按降序对键进行排序,所以我假设键实现了Comparable,但由于我不知道你的键的类型是什么,所以我使用类型参数KV 作为占位符。

    Map<K, V> map = new HashMap<>();
    List<Map.Entry<K, V>> list = new ArrayList<>(map.entrySet());
    Collections.sort(list, new Comparator<Map.Entry<K, V>>() {
        @Override
        public int compare(Entry<K, V> o1, Entry<K, V> o2) {
            Comparable k1 = (Comparable) o1.getKey();
            Comparable k2 = (Comparable) o2.getKey();
            return -k1.compareTo(k2);
        }
    });

【讨论】:

    猜你喜欢
    • 2016-06-15
    • 2013-11-02
    • 2011-05-02
    • 2018-02-16
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2016-12-25
    相关资源
    最近更新 更多