我需要一个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没有提供一个有效的界面来按键查找值,我现在确实有这个要求。
所以,我的问题是:
TreeMap.values()
的顺序相同?答案 0 :(得分:4)
TreeMap
保持关键的自然顺序。您甚至可以按值的自然顺序/反向顺序对其进行排序(对比较器进行更多操作和自定义定义)。但这与说&#34;插入顺序&#34;不同。要维护广告订单,您需要使用LinkedHashMap
。 Java LinkedHashMap
是HashMap
的子类 - 类比与LinkedList
相同,您可以在其中维护下一个节点的跟踪。但是,它说不能保证&#34;保证&#34;如果你突然看到订单被HashMap
答案 1 :(得分:3)
TreeMap
的文档说:
地图根据其键的自然顺序排序,或者根据地图创建时提供的
Comparator
排序,具体取决于使用的构造函数。
因此,除非您提供Comparator
并跟踪广告订单并在Comparator
中使用它,否则您将获得密钥的自然顺序,而不是密钥的顺序插入
如果您想要广告订单as davide said,可以使用LinkedHashMap
:
Map
接口的哈希表和链表实现,具有可预测的迭代顺序...此链表定义了迭代顺序,通常是键插入映射的顺序(插入顺序)。请注意,如果某个键重新插入到地图中,则不会影响广告订单。
答案 2 :(得分:2)
您需要的是LinkedHashMap 另见another question。