4

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

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

假设我想TreeMap用 keysK和 values构建一个V。那么当然TreeMap需要知道如何比较K. 我的问题:如果K已经实现了一个比较器,并定义了比较方法,会TreeMap读吗?还是我还需要在构造函数中指定比较器?在这个问题上,我最喜欢的一点是使用 . 在类中编写一个比较器类TreeMap,如下所示:Java: SortedMap, TreeMap, Comparable? 如何使用?

现在,到目前为止,我实际上已经将比较器传递给了构造函数,并且它似乎构建得很好。但是当我尝试将其传递给 时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;

问题是我真的希望TreeMaps 内部的HashMaps 使用 this 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 知道我希望它如何在上面的 HashMap 内部比较 K 中的键的问题确实是我遇到的更大的问题。

4

1 回答 1

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>到. 在实例化每个包含的 s之前,您无法设置比较器。put()HashMapTreeMap

于 2012-11-24T06:34:53.443 回答