今天我遇到了一个像这样的奇怪问题 首先,我初始化一个映射,用于在jsp中存储select对象的数据。
Map<String, String> bankIds = ImmutableMap.<String, String>builder() // Dummy data
.put("", "")
.put("JobStart", "Job Start Bank")
.put("JobEnd", "Job End Bank")
.put("CspMod", "Bank For Completed CSP Builds. Stock For Second Level Build")
.put("TEMPBANK", "TEMPBANK")
.build();
在jsp中,我添加了一些隐藏的字段来存储这个地图,而无需从DB中重新获取它。
<div id="hiddenAttributes" hidden="hidden">
<c:forEach var="entry" items="${lotSearchForm.bankIds}">
<form:input path="bankIds[${entry.key}]" />
</c:forEach>
但是在提交到服务器之后,地图已经按键排序了。现在订单是:
{CspMod=Bank For Completed CSP Builds. Stock For Second Level Build, JobEnd=Job End Bank, JobStart=Job Start Bank, TEMPBANK=TEMPBANK, =}
结果是选择对象中的选项顺序发生了变化。
所以这是我的问题:
1.为什么在提交到服务器后对地图进行排序?我使用LinkedHashMap但结果仍然相同。
2.有没有办法阻止地图中的自动排序,比如我的问题?
3.我的设计有什么解决方案吗?我的项目禁止会议。
感谢
的修改
为了便于理解,这是我的背景:
首先我有这样的地图。
LinkedHashMap<String, String> bankIds = new LinkedHashMap<String, String>();
bankIds.put("", "");
bankIds.put("JobStart", "Job Start Bank");
bankIds.put("JobEnd", "Job End Bank");
bankIds.put("CspMod", "Bank For Completed CSP Builds. Stock For Second Level Build");
bankIds.put("TEMPBANK", "TEMPBANK");
所以,这张地图的顺序是&#34;&#34; - &GT; JobStart - &gt; JobEnd - &gt; CspMod - &gt; TEMPBANK
这是正确的顺序
我使用这个地图作为像这样的jsp中的选项。
<form:select path="bankId" items="${lotSearchForm.bankIds}"/>
在输出html中,选项的顺序与上图的顺序相同。
为了防止从DB(地图数据)重新获取数据,我还添加了地图的隐藏属性。
<div id="hiddenAttributes" hidden="hidden">
<c:forEach var="entry" items="${lotSearchForm.bankIds}">
<form:input path="bankIds[${entry.key}]" />
</c:forEach>
</div>
直到现在,订单是正确的。输出html的顺序正确为
<div id="hiddenAttributes" hidden="hidden">
<input type="text" name="bankIds[]" value="" />
<input type="text" name="bankIds[JobStart]" value="Job Start Bank" />
<input type="text" name="bankIds[JobEnd]" value="Job End Bank" />
<input type="text" name="bankIds[CspMod]" value="Bank For Completed CSP Builds. Stock For Second Level Build" />
<input type="text" name="bankIds[TEMPBANK]" value="TEMPBANK" />
</div>
但是当我执行搜索操作时,我从控制器收到的数据图的顺序不正确
在向控制器提交后,地图已被分类。现在,地图的顺序是:
CspMod - &gt; JobEnd - &gt; JobStart - &gt; TEMPBANK - &gt; &#34;&#34;
- &GT;我想要的是收到的地图与初始化地图的顺序相同
清除?
答案 0 :(得分:0)
地图没有已定义的排序顺序,除非您使用专门的实现,并将其添加到顶部,例如你改用SortedSet / TreeSet / LinkedHashMap。
Guavas ImmutableSet使用基于散列的排序 - 这是设计随机的。