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

Why don't TreeMap.values() reflect the order in which elements were originally added?

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

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

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

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

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

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

所以,我的问题是:

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

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


    TreeMap的文件说:

    The map is sorted according to the natural ordering of its keys, or by a Comparator provided at map creation time, depending on which constructor is used.

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

    如果您想要插入订单,正如davide所说,您可以使用LinkedHashMap

    Hash table and linked list implementation of the Map interface, with predictable iteration order...This linked list defines the iteration ordering, which is normally the order in which keys were inserted into the map (insertion-order). Note that insertion order is not affected if a key is re-inserted into the map.


    你需要的是LinkedHashMap
    另见另一个问题。