为什么不让TreeMap.values()反映最初添加元素的顺序?

时间:2015-03-18 20:38:00

标签: java sorting data-structures

我需要一个data structure,它可以按键执行lookup map的角色,也可以转换为sorted list。进入的数据是一个非常siple代码描述对(例如 M /已婚 D /离婚等)。查找要求是为了在用户在UI中进行选择(其值为代码)后获取描述。排序列表要求是为了将数据提供给以List为输入的UI组件(JSF),并且值始终需要以相同的顺序显示(按字母顺序排列)。

首先想到的是TreeMap。所以我按照我希望它在UI中显示的顺序从我的数据库中检索数据并将其加载到我的树形图中,由代码键入,以便稍后我可以在用户进行选择后查找描述以进一步显示。至于从同一个地图中获取排序列表,根据this post,我正在执行以下操作:

List<CodeObject> list = new ArrayList<CodeObject>(map.values());

但是,列表的排序顺序与放入地图的顺序不同。地图被声明为SortedMap并实现为TreeMap:

SortedMap<String, CodeObject> map = new TreeMap<String, CodeObject>().

CodeObject是一个简单的POJO,只包含代码和描述以及相应的getter(通过构造函数设置),其中一个列表被提供给UI组件,它使用代码作为值和显示说明。我曾经只使用List而且在订购方面工作得很好但是List没有提供一个有效的界面来按键查找值,我现在确实有这个要求。

所以,我的问题是:

  1. 如果TreeMap应该是项目添加顺序中的地图,为什么不是TreeMap.values()的顺序相同?
  2. 我应该怎样做才能满足上面解释的要求,即有一个数据结构既可以作为查找映射又可以作为元素的有序集合?如果我以不同的方式使用它或者我是否需要一种完全不同的方法,TreeMap会为我做吗?

3 个答案:

答案 0 :(得分:4)

TreeMap保持关键的自然顺序。您甚至可以按值的自然顺序/反向顺序对其进行排序(对比较器进行更多操作和自定义定义)。但这与说&#34;插入顺序&#34;不同。要维护广告订单,您需要使用LinkedHashMap。 Java LinkedHashMapHashMap的子类 - 类比与LinkedList相同,您可以在其中维护下一个节点的跟踪。但是,它说不能保证&#34;保证&#34;如果你突然看到订单被HashMap

维持,那么订单就会被维护,所以不要回要你的钱

答案 1 :(得分:3)

TreeMap的文档说:

  

地图根据其键的自然顺序排序,或者根据地图创建时提供的Comparator排序,具体取决于使用的构造函数。

因此,除非您提供Comparator并跟踪广告订单并在Comparator中使用它,否则您将获得密钥的自然顺序,而不是密钥的顺序插入

如果您想要广告订单as davide said,可以使用LinkedHashMap

  

Map接口的哈希表和链表实现,具有可预测的迭代顺序...此链表定义了迭代顺序,通常是键插入映射的顺序(插入顺序)。请注意,如果某个键重新插入到地图中,则不会影响广告订单。

答案 2 :(得分:2)

您需要的是LinkedHashMap 另见another question