根据列表的顺序对地图重新排序



假设我有两个数据结构,一个有序的字符串列表和一个HashMap。该列表如下所示:

types = ["string", "integer", "boolean", "integer"];

以及带有对象键和字符串值的 HashMap,如下所示:

map = {2=integer, true=boolean, 7=integer, "dog"=string};

重新组织地图的"顺序"以使地图的值与列表的顺序保持一致的最简单/最有效的方法是什么,即地图现在在打印时看起来像这样:

map = {"dog"=string, 2=integer, true=boolean, 7=integer};
HashMap

不提供订单保证。从文档中:

此类不保证映射的顺序;特别是,它不保证顺序在一段时间内保持不变。

因此,如果你想要一个有序的Map你通常希望从SortedMap(文档(的实现开始。

不幸的是,SortedMap按键排序,并且您希望按值排序,因此您要么必须查看第三方集合库,要么考虑LinkedHashMap(文档(之类的东西,它具有可预测的迭代顺序,即使它不维护排序。

如您的示例所示,当有两个整数时,您将使用什么策略来决定使用哪个整数?

像这样构建反向哈希图,

types = ["string", "integer", "boolean", "integer"];
map = {2=integer, true=boolean, 7=integer, "dog"=string};
reversedmap = {integer=[2,7], boolean=true, string=dog};

然后遍历列表并从反向映射中获取相应的键。

例如,首先你从类型 -> 中得到"字符串",所以你知道相应的键应该是"dog"。将此键值对插入其他映射(类型为LinkedHashMap(。继续这样做,直到到达类型列表的末尾。

编辑:感谢您@FedericoPeraltaSchaffner指出这一点。

如果你从反向映射中得到两个值(例如,在"整数"元素的情况下(,你可以选择其中一个(不管哪个(插入到LinkedHashMap中,同时随后将其从反向映射中删除。然后你进入类型列表中的下一个元素

最新更新