首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按值维护SortedMap

按值维护SortedMap
EN

Stack Overflow用户
提问于 2013-05-14 22:27:42
回答 3查看 997关注 0票数 4

正如我们所知道的,SortedMap维护按键排序的条目。我在这个论坛上读了很多帖子,看到了很多例子,这些例子按照值对SortedMap进行了排序。但是,正如您所知道的,当我将一个条目放到默认的SortedMap时,它不会再次对映射排序,只是将这个新条目放在它应该在的位置。

例如,

代码语言:javascript
复制
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进行排序,如下所示:

代码语言:javascript
复制
sortedMap.sort(sortedMap.entries()); 

调用此方法或其他方法来获取排序后的值。

但是,我需要一个Map实现来保持值的排序,而不是像我在上面解释的那样调用排序方法。例如,在上面的代码中,我只能调用firstKey()方法;但是我需要调用firstValue()方法。

代码语言:javascript
复制
Person minimumAgePerson = sortedMap.firstValue().
System.out.println(minimumAgePerson.getName()); // it should print "Susan"

SortedSet不适合我的需求,因为我可以将一些新的对象( Person )放在映射中,这些新添加的条目应该覆盖现有的对象(所以我需要一个映射):

代码语言:javascript
复制
Person p4 = new Person("Susan",39);
sortedMap.put(p4.getName(),p4);
Person newMinimumAgePerson = sortedMap.firstValue(); 
System.out.println(newMinimumAgePerson.getName()); // it should print "Tom"

有没有实现来完成这个任务,或者我需要自己实现SortedSet?

EN

回答 3

Stack Overflow用户

发布于 2013-05-14 22:39:49

我认为对您来说最好的方法是创建一个同时包含Map (用于键关联)和SortedSet (以便对值进行排序)的自定义类型

我不清楚您是否希望两个不同的键具有相同的值。在这种情况下,您需要使用某种SortedMultiSet。

票数 3
EN

Stack Overflow用户

发布于 2013-05-14 22:54:29

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

考虑到上述要求,我将使用一个SortedMap来包含值,并使用一个将键映射到值的HashMap。为了防止键重复,请将键值对放入HashMap中,并检查put结果。如果密钥已经存在,请在添加新值之前从SortedMap中删除旧值。

如果您有其他需求,这种特殊的设计可能不会涵盖所有内容,但是组合java.util结构的概念通常是有用的。

票数 3
EN

Stack Overflow用户

发布于 2013-05-14 22:34:21

没有同时包含键和值排序的实现。但实际上,任何这样做的实现都需要一个单独的数据结构来按值排序,所以您最好自己创建这个数据结构。

我建议根据您的需要,只实现一个排序结构,使用现有的结构,如TreeMap或PriorityQueue。完成后,我可能会使用自定义结构扩展TreeMap,并覆盖put、remove、addAll等方法,将其放在超级映射中,也放在您的sort by keys结构中。

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

https://stackoverflow.com/questions/16545871

复制
相关文章

相似问题

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