【问题标题】:How to write values() method of sortedMap in Java?如何在 Java 中编写 sortedMap 的 values() 方法?
【发布时间】:2012-12-08 03:43:35
【问题描述】:

我很好奇是否有人有关于如何开始编写实现 Java 的 sortedmap 接口的类的 values() 方法的提示。如果可能的话,示例代码将不胜感激。

【问题讨论】:

  • 你的排序图是如何实现的?这实际上只是实现entrySet()keySet() 也是如此)的一个特例,所以请先考虑一下。
  • 这在很大程度上取决于您的排序地图实现。您是否已经想出一种方法来按顺序遍历您的地图条目?如果是这样,那么 values() 的实现将相当简单。

标签: java interface sortedmap


【解决方案1】:

TreeMap,它是 SortedMap 接口的一个实现,可能是做一些研究的好地方:

http://www.docjar.com/html/api/java/util/TreeMap.java.html

【讨论】:

    【解决方案2】:

    除非您的 SortedMap 实现保留了地图值的列表(或任何其他可遍历的集合),否则您的 values() 实现很可能就是这样(这是非常普遍的):

    public Collection<V> values() {
        List<V> values = new ArrayList<V>();
        for (K key: keySet()) {
            values.add(get(key));
        }
    }
    

    【讨论】:

    • 你的代码效率很低。这里有一个提示:查看Map.entrySet()
    • entrySet() 最终仍将迭代keySet(),查找每个实例并实例化Map.Entry 实例。我错过了什么?
    • 您错过了遍历条目集避免了您的代码进行的 n 次查找(通过调用 get(),这很昂贵),因为您可以直接使用 entry.getValue()。看我的回答
    【解决方案3】:

    专注于实现entrySet()。完成后,请执行以下操作:

    public Collection<V> values() {
        List<V> values = new ArrayList<V>();
        for (Map.Entry<K, V> entry : entrySet()) {
            values.add(entry.getValue());
        }
        return values;
    }
    

    【讨论】:

    • 您肯定需要解释为什么关注entrySet() 更有益。此外,OP专门询问了values();有可能entrySet()已经写好了,谁知道呢,说不定他连现有的entrySet()实现都修改不了。
    • 关于您对我的回答的评论:您得出的结论是这种方法更有效,因为entrySet() 的假设的、可能不在 OP 控制范围内的实现比发出一系列get() 操作。坦率地说,如果 OP 没有提供更多关于他们真正想要完成的工作(以及他们已经编写的内容)的信息,就不可能得出一种比另一种更有效的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    相关资源
    最近更新 更多