首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有自定义比较器的TreeMaps在HashMaps中

带有自定义比较器的TreeMaps在HashMaps中
EN

Stack Overflow用户
提问于 2012-11-24 06:28:15
回答 1查看 2.7K关注 0票数 4

我对Java非常陌生,尤其是下面讨论的话题,但是我花了很多时间尝试解决这个问题,并阅读了之前在这个站点上给出的答案,而且我并没有在这个问题上找到任何直接的内容,所以我认为这可能是值得一问的。

我的问题其实是双重的。我想要解决的实际问题是构建一个订单手册程序,我想使用价格-时间优先级进行排序。最终目标是构建一个类似于HasMap<ticker, TreeMap<Priority,Order>>的结构,其中Priority是我编写的一个类,它首先根据价格实现比较器,然后根据时间实现比较器。这样做使我产生了我在这里提出的问题(我正在做的工作的实际设置并不是真正相关的,但我想给出为什么我要看这个)。

假设我想要构建一个TreeMap,其键为K,值为V。当然,TreeMap需要知道如何比较K中的对象。我的问题是:如果K已经实现了一个比较器,并定义了比较方法,那么TreeMap会读取它吗?还是仍然需要在构造函数中指定比较器?关于这个问题,我最喜欢的一点是使用TreeMap在类中编写一个比较器类,如下所示:Java: SortedMap, TreeMap, Comparable? How to use?

现在,到目前为止,我已经将比较器传递给构造函数,它似乎构建得很好。但是,当我试图将它传递到HashMap时,我会得到一个错误。守则如下:

代码语言:javascript
复制
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;

问题是,我真的希望HashMap中的HashMaps使用这个Comparator,但是当我这样做时,Java会生气。因此,我的第二个问题是:如果您想使用这样的结构(HashMap(-,TreeMap)),并且希望TreeMap使用自定义比较器,那么您如何做到这一点?

编辑:--我在上面提到过这个,但没有展示我在说什么。真对不起。我实际上希望看到的情况是:

代码语言:javascript
复制
protected HashMap<String, TreeMap<Priority, Order>((Comparator<? super Priority>) priorityCompare)> _buyBook;
protected HashMap<String, TreeMap<Priority,Order>((Comparator<? super Priority>) priorityCompare)> _sellBook;

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-24 06:34:53

如果TreeMap的键实现了equals()hashCode()Comparable<Key>,那么TreeMap将使用key类的compareTo()方法。

编辑:

至于您的代码,我在Eclipse中使用Java7编译时没有出现错误。我甚至可以做到这一点,不需要演员:

代码语言:javascript
复制
protected Comparator<Priority> priorityCompare;
protected TreeMap<Priority, Order> _buy = new TreeMap<Priority, Order>(priorityCompare);

编辑2:

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

代码语言:javascript
复制
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,否则无法设置比较器。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13538921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档