我在我的应用程序中使用TreeMap类来存储消息信息及其优先级。 我使用了一个treeMap类来做它,因为这个类根据键值自动命令元素,例如我有这种情况:
enum Priority { HIGH, MEDIUM, LOW }
TreeMap<Priority,String> tMap = new TreeMap<Priority,String>();
我使用密钥(消息的优先级)根据优先级严重性自动排序消息,但问题是在TreeMap中密钥是唯一的,如果我尝试插入两条具有相同优先级的消息,则第一个被覆盖....
如何在TreeMap上更改此行为并禁用唯一约束?
是否有类似TreeMap的类允许为多个元素放置相同的键?
答案 0 :(得分:8)
如何在TreeMap上更改此行为并禁用唯一约束?
你做不到。密钥的唯一性是Map
接口的基本不变量。
是否有类似TreeMap的类允许为多个元素放置相同的键?
您可以将其实现为Map<Priority,List<String>>
并自行管理列表。如果(例如)您希望以fifo顺序处理给定优先级的消息,这是一个不错的选择。
或者,您可以使用MultiMap
类;例如来自Apache commons collections或Guava。
答案 1 :(得分:1)
查看Google Guava库中的TreeMultimap类。
答案 2 :(得分:0)
您可能想要另一种集合类型。但如果您打算使用TreeMap,那么:
1)考虑使用更复杂的Priority类。也许创建一个优先级类型,它既包含基本优先级(HIGH),也包含每次获得新优先级时增加的唯一编号。然后使用该额外值实现equals,hash,Comparable等。
2)对于每个优先级,值可以是Collection。检索给定优先级的值,并将新值附加到检索到的集合的末尾。但是,在这一点上,使用TreeMap有点矫枉过正。
另外,请查看Apache Commons Collections。
答案 3 :(得分:0)
您可能希望使用其他结构而不是树形图。
地图是地图,行为就是这样,所以在地图中,根据定义,你不能拥有两次相同的密钥。