让我们说我有两个数据结构,一个有序的字符串列表和一个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};
答案 0 :(得分:3)
HashMap
不提供订单保证。来自documentation:
此类不保证地图的顺序;特别是,它不能保证顺序会随着时间的推移保持恒定。
因此,如果您想要订购的Map
,通常需要从SortedMap
(documentation)的实现开始。
不幸的是,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中,同时随后将其从逆向地图。然后您转到类型列表中的下一个元素