在HashMaps中使用自定义比较器的TreeMaps

时间:2012-11-24 06:28:15

标签: java hashmap comparator treemap

我对Java很新,尤其是我正在讨论的主题,但是我花了很多时间尝试解决这个问题以及之前在这个网站上给出的答案,我不是真的直接找到了什么,所以我觉得这可能值得一提。

我的问题实际上是双重的。我想要解决的实际问题涉及构建订单簿程序,我想使用价格 - 时间优先级进行排序。最终目标是构建一个看起来像HasMap<ticker, TreeMap<Priority,Order>>的结构,其中Priority是我编写的类,它首先根据价格然后按时实现比较器。这样做让我想到了我在这里提出的问题(我正在研究的实际设置并不是真正相关的,但我想弄清楚为什么我在看这个)。

假设我想使用键TreeMap和值K构建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;

问题是我真的希望TreeMap内的HashMap使用这个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;

通过这种方式,TreeMaps知道我希望他们如何在类Priority上使用Comparator。但是,执行此操作时,它会给我一个语法错误(并告诉我删除这些令牌)。我也尝试将_buy(如我的初始代码框中所写)作为值传递,但这不起作用,我立即意识到这一切都是愚蠢的。无论如何,我如何让TreeMap知道我希望它如何比较K中的键而在HashMap内部的问题确实是我的问题。

1 个答案:

答案 0 :(得分:3)

如果TreeMap的密钥实现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 s。

之前,不能设置比较器