Java HashMaps中带有自定义比较器的树映射

Java HashMaps中带有自定义比较器的树映射,java,hashmap,comparator,treemap,Java,Hashmap,Comparator,Treemap,我对Java非常陌生,尤其是我在下面讨论的主题,但我花了大量时间试图解决这个问题,并阅读了之前在这个网站上给出的答案,我并没有找到任何直接的要点,所以我认为这可能值得问一问 我的问题实际上有两个方面。我希望解决的实际问题涉及到构建订单簿程序,我想使用价格-时间优先级进行排序。最终目标是构建一个类似于HasMap的结构,其中Priority是我编写的一个类,它首先基于价格,然后基于时间实现一个比较器。这样做让我想到了我在这里要问的问题(我正在研究的实际设置并不是真正相关的,但我想说明我为什么要看这

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

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

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

现在,我实际上已经将比较器传递给了构造函数,它看起来构建得很好。但当我试图将其传递到
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;

这样树形图就知道我希望它们如何在类优先级上使用比较器。但是,在执行此操作时,它会给我一个语法错误(并告诉我删除这些标记)。我也尝试过将_buy(正如我在初始代码框中写的)作为值传递,但这不起作用,我一做就立刻意识到这是愚蠢的。无论如何,我要问的问题是,如何让TreeMap知道我希望它在上面的HashMap中如何比较K中的键,这确实是我面临的更大的问题。

如果
TreeMap的键实现了
equals()
hashCode()
Compariable
,然后
TreeMap
将使用键类“
compareTo()
方法

编辑:

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

protected Comparator<Priority> priorityCompare;
protected TreeMap<Priority, Order> _buy = new TreeMap<Priority, Order>(priorityCompare);
受保护比较器优先组件;
受保护树形图_buy=新树形图(优先公司);
编辑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));
}
protectedmap\u buyBook=
新的HashMap();
公共void init()
{
_买书。看跌期权(“键1”,你买);
//或
_buyBook.put(“key1”,新树形图(priorityCompare));
}

您的_buyBook声明仅实例化
HashMap
。您必须创建
TreeMap
put()
的实例,并将它们放入
HashMap
。在实例化每个包含的
TreeMap
s之前,您无法设置比较器。

知道这一点很好,但我可能真的希望能够比较任意两个优先级对象,而不仅仅是将一个与给定的固定对象进行比较。这就是我最初拒绝这种方法的原因(尽管我可以再仔细考虑一下,看看在这种情况下是否有意义)。但是如果没有这个,我们仍然需要在构造函数中传递比较器?不确定“而不是…给定的固定值”是什么意思。如果您的类实现了
Comparable
,则
TreeMap
将在各种对象实例上调用
compareTo()
方法,以维持顺序。没有“固定的比较”发生。哦,我明白了,这是一个很好的观点,而且可能是解决这个问题的更聪明的方法,现在我想起来了。关于对上面答案的编辑,请参阅我对原始帖子的编辑,通过在HashMap内的树状图中传递比较器,您可以确切地看到我指的是什么。我可能会编辑我的项目,以使用您的类似建议;然而,让这个数据结构工作起来似乎仍然是一个有趣的问题(至少对我来说是这样)顺便说一句,谢谢你迄今为止的帮助。啊,好的,我明白了,这是有道理的。谢谢你的帮助!
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));
}