TreeMap没有唯一键

时间:2011-06-04 06:53:54

标签: java jdk1.6

我在我的应用程序中使用TreeMap类来存储消息信息及其优先级。 我使用了一个treeMap类来做它,因为这个类根据键值自动命令元素,例如我有这种情况:

enum Priority { HIGH, MEDIUM, LOW }
TreeMap<Priority,String> tMap = new TreeMap<Priority,String>();

我使用密钥(消息的优先级)根据优先级严重性自动排序消息,但问题是在TreeMap中密钥是唯一的,如果我尝试插入两条具有相同优先级的消息,则第一个被覆盖....

如何在TreeMap上更改此行为并禁用唯一约束?

是否有类似TreeMap的类允许为多个元素放置相同的键?

4 个答案:

答案 0 :(得分:8)

  

如何在TreeMap上更改此行为并禁用唯一约束?

你做不到。密钥的唯一性是Map接口的基本不变量。

  

是否有类似TreeMap的类允许为多个元素放置相同的键?

您可以将其实现为Map<Priority,List<String>>并自行管理列表。如果(例如)您希望以fifo顺序处理给定优先级的消息,这是一个不错的选择。

或者,您可以使用MultiMap类;例如来自Apache commons collectionsGuava

答案 1 :(得分:1)

查看Google Guava库中的TreeMultimap类。

答案 2 :(得分:0)

您可能想要另一种集合类型。但如果您打算使用TreeMap,那么:

1)考虑使用更复杂的Priority类。也许创建一个优先级类型,它既包含基本优先级(HIGH),也包含每次获得新优先级时增加的唯一编号。然后使用该额外值实现equals,hash,Comparable等。

2)对于每个优先级,值可以是Collection。检索给定优先级的值,并将新值附加到检索到的集合的末尾。但是,在这一点上,使用TreeMap有点矫枉过正。

另外,请查看Apache Commons Collections

答案 3 :(得分:0)

您可能希望使用其他结构而不是树形图。

地图是地图,行为就是这样,所以在地图中,根据定义,你不能拥有两次相同的密钥。