2013-05-14 52 views
4

正如我们所知,SortedMap维护按键排序的条目。我在这个论坛上阅读了很多主题,并看到很多通过值来排序SortedMap的例子。然而,正如你所知道的,当我把一个项目放到默认的SortedMap中时,它不会再把这个新的条目放在它应该是的地方。按值维护SortedMap

例如,

SortedMap<String,Person> sortedMap = new TreeMap(); 
Person p1 = new Person("John",38); 
sortedMap.put(p1.getName(), p1); 
Person p2 = new Person("Tom",34); 
sortedMap.put(p2.getName(), p2); // does not sort, maintains sorted set by comparing the other values 
Person p3 = new Person("Susan",21); 
sortedMap.put(p3.getName(), p3); // does not sort, maintains sorted set by comparing the other values 

在这个论坛很多线程,我看到了很多很多的代码,通过调用一种方法一样排序由值的SortedMap:

sortedMap.sort(sortedMap.entries()); 

这或别的东西,方法被调用来获取排序的值。

但是,我需要一个Map实现,它使值保持排序而不需要调用排序方法,正如我在上面解释的。例如,在上面的代码中,我可以调用firstKey()方法;但是我需要调用firstValue()方法。

Person minimumAgePerson = sortedMap.firstValue(). 
System.out.println(minimumAgePerson.getName()); // it should print "Susan" 

的SortedSet是不适合我的requiremenets,因为我可以把一些新的对象(人),其键值已经在地图上,这些刚刚添加的条目应覆盖现有的对象(所以我需要一个地图):

Person p4 = new Person("Susan",39); 
sortedMap.put(p4.getName(),p4); 
Person newMinimumAgePerson = sortedMap.firstValue(); 
System.out.println(newMinimumAgePerson.getName()); // it should print "Tom" 

有没有实现这个taks或我需要实现SortedSet自己?

+1

你为什么需要这样的事情?我相信你已经为你的任务选择了错误的数据结构,因为我可以想象,实际上没有应用按值排序的Map,其中某些其他结构无法使用(例如排序列表或其他)。 – bezmax 2013-05-14 14:38:45

回答

1

没有包含按键和值排序的实现。但是确实有这样做的任何实现都需要一个单独的数据结构来进行按值排序,所以您不妨自己创建数据结构。

我会建议要么实施一个排序结构,使用现有的一个像TreeMap或PriorityQueue根据您的需要。一旦完成,我可能会使用自定义结构来扩展TreeMap,并覆盖put,remove,addAll等方法,将它放在超级地图中,也可以按键结构排序。

3

我觉得你最好的办法是创建一个包含一个(用于键关联)地图自定义类型,如果SortedSet(以价值排序)

这是我不太清楚,如果你希望能够为两个不同的键具有相同的值。在这种情况下,你需要使用某种SortedMultiSet。

+0

我目前想知道是否扩展这两个包含的集合中的一个是个好主意。我想这取决于你如何使用它,但我会害怕我可能会忘记重写一个返回错误的方法 – Zerdligham 2013-05-14 14:43:22

3

通常,处理这类问题的最简单和最安全的方法是编写一个使用两个不同标准集合的类。该类可以提供您需要的方法,不一定符合任何java.util接口。

鉴于声明的要求,我会使用SortedMap来包含这些值,并将其与HashMap映射关键值结合使用。为了防止重复键,将键值对放在HashMap中,检查放置结果。如果键已存在,则在添加新值之前,从SortedMap中删除旧值。

如果您有其他需求,这个特定的设计可能不包括所有的东西,但是组合java.util结构的概念通常是有用的。