按照自定义预定顺序重新排列HashMap的键

4

我有一个HashMap<String, String>需要按照特定顺序排序。 我知道由于HashMap的构造方式,它们不能轻易地进行排序。 然而,我正在寻找重新排列HashMap键的最佳策略。例如,我的当前HashMap看起来像这样:

"folioProperties": {
    "strategy": "Strategy",
    "summary": "Summary",
    "initiative": "Initiative",
    "deliveryMilestone": "Delivery Milestone",
    "onTarget": "On Target",
    "size": "Size",
    "driver": "Driver",
    "issueName": "Issue Name",
    "releaseWindow": "Release Window",
    "type": "Type",
    "targetQuarter": "Target Quarter"
}

我有一个表格视图,它将这些属性显示为列,并且我需要按照策略、倡议、问题名称、摘要、交付里程碑、准时、大小、目标季度、驱动程序、类型、发布窗口的顺序对列/哈希映射进行排序。
任何建议都将不胜感激!
P.S. 在构建HashMap之前,键在List<String>中。

5
请使用 LinkedHashMap - Eran
1
@Eran-- 我认为OP是在询问排序而不是顺序,所以我认为TreeMap在这里是最好的选择。 - T-Bag
2
LinkedHashMap 保留插入顺序,因此这似乎是最简单的方法,除非您想创建自己的 Comparator 来保留排序。 - Henrik Aasted Sørensen
1
@FJJunior:取决于您要放入地图中的数据源。一般来说,您放入LinkedHashmap的第一件事将是迭代器返回的第一件事,依此类推。 - Henrik Aasted Sørensen
1
@Henrik,感谢您的帮助 - 最终使用了LinkedHashMap - FJ Junior
显示剩余6条评论
2个回答

5

看起来您并不理解您试图解决的问题。 哈希表是一种存储信息的工具。 很可能您根本不需要对哈希表进行排序。 相反,您可能需要按特定顺序显示元素。

以下是两种按特定顺序检索哈希表中元素的方法:

按所需顺序检索元素

blam = map.get("strategy");
... do something with blam.

blam = map.get("Initiative");
... do something with blam.

... repeat for all elements.

将键排序,然后按顺序检索它们

keyList.addAll(map.keySet());
Collections.sort(keyList, yourComparator);
for (final String current : keyList)
{
    blam = map.get(current);
    ... do something with blam.
}

不要再用Map来表示一个对象

建立一个类,可以命名为FolioProperties,来表示Folio的属性。

public class FolioPropertiesFND
{
    private String initiative;
    private String strategy;
    ... one field per property.

    public String getInitiative()
    {
        return initiative;
    }

    public void setInitiative(final String newValue)
    {
        initiative = newValue;
    }
}

1
如果你的数据在地图构建之前已经排好序,那么你需要使用 java.util.LinkedHashMap
从javadoc中可以看到:
哈希表和链表实现了Map接口,并具有可预测的迭代顺序。这个实现与HashMap不同之处在于它维护了一个双向链表,通过所有条目。这个链接列表定义了迭代顺序,通常是键被插入到映射中的顺序(插入顺序)。
这个实现使其客户免于由HashMap(和Hashtable)提供的未指定的、普遍混乱的排序,而不会产生与TreeMap相关的成本增加。
如果使用LinkedHashMap,那么你只需要按正确的顺序放置键/值对,地图将确保相同的迭代顺序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接