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

时间:2018-10-24 21:47:46

标签: java list sorting hashmap

让我们说我有两个数据结构,一个有序的字符串列表和一个HashMap。列表如下:

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

带有对象键和String值的HashMap看起来像:

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

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

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

2 个答案:

答案 0 :(得分:3)

HashMap不提供订单保证。来自documentation

  

此类不保证地图的顺序;特别是,它不能保证顺序会随着时间的推移保持恒定。

因此,如果您想要订购的Map,通常需要从SortedMapdocumentation)的实现开始。

不幸的是,SortedMap按键排序,而您想按值排序,因此您要么必须查看第三方集合库,要么考虑使用类似LinkedHashMap({{ 3}}),即使它不保持排序,它的迭代顺序也可以预测。

当示例显示两个整数时,您将使用哪种策略来决定使用哪个整数?

答案 1 :(得分:1)

像这样构建反向哈希图,

from datetime import datetime, timedelta
d='09-24-2016'
d1=datetime.strptime(d, '%m-%d-%Y')
[(d1-timedelta(days=i)).strftime('%m-%d-%Y') for i in range(6,0,-1)]
['09-20-2016','09-21-2016', '09-22-2016', '09-23-2016', '09-24-2016', '09-25-2016']

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

例如,首先您从类型->中获得“字符串”,因此您知道相应的键应为“ dog”。将此键值对插入其他映射中(类型为types = ["string", "integer", "boolean", "integer"]; map = {2=integer, true=boolean, 7=integer, "dog"=string}; reversedmap = {integer=[2,7], boolean=true, string=dog}; )。继续这样做,直到到达类型列表的末尾。

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

如果您从反向映射中获得了两个值(例如,对于“整数”元素),则可以选择其中一个(无关紧要)插入到LinkedHashMap中,同时随后将其从逆向地图。然后您转到类型列表中的下一个元素

相关问题