提交到控制器后,地图是自动排序的?

时间:2017-07-24 10:06:50

标签: java spring sorting spring-mvc dictionary

今天我遇到了一个像这样的奇怪问题 首先,我初始化一个映射,用于在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;我想要的是收到的地图与初始化地图的顺序相同 清除?

1 个答案:

答案 0 :(得分:0)

地图没有已定义的排序顺序,除非您使用专门的实现,并将其添加到顶部,例如你改用SortedSet / TreeSet / LinkedHashMap。

Guavas ImmutableSet使用基于散列的排序 - 这是设计随机的。