java - HashMaps 中带有自定义比较器的 TreeMaps

标签 java hashmap comparator treemap

我是 Java 的新手,尤其是我在下面讨论的主题,但我花了很多时间尝试解决这个问题并阅读了之前在此站点上给出的答案,但我不是真的能直接找到任何东西,所以我认为这可能值得一问。

我的问题实际上有两个方面。我要解决的实际问题涉及构建订单簿程序,我想使用价格-时间优先级进行排序。最终目标是构建一个类似于 HasMap<ticker, TreeMap<Priority,Order>> 的结构。其中 Priority是我编写的一个类,它实现了一个首先基于价格然后基于时间的比较器。这样做让我想到了我在这里要问的问题(我正在做的事情的实际设置并不真正相关,但我想说明我为什么要看这个)。

假设我想构建一个 TreeMap带 key K和值(value)观 V .那当然TreeMap需要知道如何比较 K 中的对象.我的问题:如果K已经实现了一个比较器,并定义了比较方法,将 TreeMap读那个?或者我还需要在构造函数中指定比较器吗?我最喜欢的关于这个问题的事情涉及使用 TreeMap 在类中编写比较器类。 ,如下所示:Java: SortedMap, TreeMap, Comparable? How to use?

现在,实际上到目前为止,我已经将比较器传递给了构造函数,它似乎构建得很好。但是当我尝试将其传递给 HashMap 时,我得到一个错误。代码如下:

protected Comparator<Priority> priorityCompare;

protected TreeMap<Priority, Order> _buy = new TreeMap<Priority, Order>((Comparator<? super Priority>) priorityCompare);

protected HashMap<String, TreeMap<Priority, Order>> _buyBook;
protected HashMap<String, TreeMap<Priority,Order>> _sellBook;

问题是我真的想要 TreeMapHashMap里面让我们使用这个 Comparator ,但是当我这样做时 Java 会生气。所以我的第二个问题是:如果您想使用这样的结构 (HashMap(-,TreeMap)),并且您希望 TreeMap 使用自定义比较器,您将如何做?

编辑: 我在上面提到了这一点,但没有说明我在说什么。对于那个很抱歉。我实际上想要的情况是这样的:

protected HashMap<String, TreeMap<Priority, Order>((Comparator<? super Priority>) priorityCompare)> _buyBook;
protected HashMap<String, TreeMap<Priority,Order>((Comparator<? super Priority>) priorityCompare)> _sellBook;

这样 TreeMap 就知道我希望他们如何在类 Priority 上使用比较器。然而,在这样做时,它给了我一个语法错误(并且只是告诉我删除这些标记)。我还尝试将 _buy(如我初始代码框中所写)作为值传递,但这不起作用,我一完成就立即意识到这是愚蠢的。无论如何,如何让 TreeMap 知道我希望它如何在上面的 HashMap 中比较 K 中的键的问题确实是我遇到的更大的问题。

最佳答案

如果您的 TreeMap 的 key 工具 equals() , hashCode()Comparable<Key> , 然后是 TreeMap将使用键类' compareTo()方法。

编辑:

至于您的代码,我在 Eclipse 中使用 Java7 编译时没有出现任何错误。我什至能够做到这一点,不需要强制转换:

protected Comparator<Priority> priorityCompare;
protected TreeMap<Priority, Order> _buy = new TreeMap<Priority, Order>(priorityCompare);

编辑 2:

您目前的代码不是有效的 Java。考虑:

protected Map<String, Map<Priority, Order>> _buyBook = 
    new HashMap<String,Map<Priority,Order>>();
public void init() 
{
    _buyBook.put("key1", _buy);
    // or
    _buyBook.put("key1", new TreeMap<Priority, Order>(priorityCompare));
}

您对 _buyBook 的声明实例化了 HashMap只要。您必须创建 TreeMap<Priority, Order> 的实例和 put()他们进入HashMap .在实例化每个包含的 TreeMap 之前,您无法设置比较器

关于java - HashMaps 中带有自定义比较器的 TreeMaps,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13538921/

相关文章:

java - J2ME读取文本文件

java - 无法创建名称为 Entry 的类

java - WebDriver异常: Returned value cannot be converted to WebElement: {} while using WebDriver with Safari 11 on Mac OS X

java - 为什么 HashMap 中更高的负载因子会增加查找成本?

java - 通过 int 字段的降序对列表进行排序,如果 int 字段相等则按字典顺序排序

java - 对字符串数组列表进行排序

java - Spring JPA 规范 API 的 Mockito 不完全执行动态查询

java - HashMap 的 containsKey 方法返回 false,但它的键是 integer[] 类型?

java - 将 map.values() 返回的 Collection 转换为 List

python - 是否可以在 python 中将比较器传递给 PriorityQueue