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混淆了。
-
TreeMaps不按插入顺序排序。
-
我总是被告知TreeMap保证了添加它们的条目的顺序
-
"如果TreeMap应该是项目添加顺序中的地图",你是如何得出这个结论的?
-
@ T.J.Crowder -"加法"与"插入"有什么不同?
-
@amphibient:我的意思是命令TreeMap保证不是添加/插入的顺序/无论你想要什么。完全没有。 TreeMap按键的自然顺序排序 - 即compareTo样式。所以说你的钥匙是字符串。排序将(很大程度上)按字母顺序排列。或者说它们是数字的:排序将按数字排序。
-
好吧,这不是他们被添加的顺序。但我明白了
-
@amphibient:我上面的原始评论(现已删除)真的很差。对困惑感到抱歉。我的意思是它保证订单,但它保证的顺序不是添加/插入的顺序。
-
我估计。谢谢你的澄清
-
@amphibient如果你总是被告知,你被误导了。我建议你误解,或者与LinkedHashMap混淆。如果TreeMap的行为与你描述的一样,那么它将被记录下来,而事实并非如此。
TreeMap保持关键的自然顺序。 您甚至可以按值的自然顺序/反向顺序对其进行排序(对比较器进行更多操作和自定义定义)。 但这与说"插入订单"不同。 要维护插入顺序,您需要使用LinkedHashMap。 Java LinkedHashMap是HashMap的子类 - 类比与LinkedList相同,您可以在其中维护下一个节点的跟踪。 但是,它说它不能"保证"订单得到维护,所以如果您突然看到订单被维持HashMap,请不要问您的退款
-
实际上,您只能通过"智能"黑客尝试按值进行排序,但有时这种尝试似乎有效。
-
@MarkoTopolnik beginnersbook.com/2013/12/…
-
该页面的相关性是什么? 它显示了如何对LinkedList进行排序。
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
另见另一个问题。