Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于列表排序的地图重排序_Java_List_Sorting_Hashmap - Fatal编程技术网

Java 基于列表排序的地图重排序

Java 基于列表排序的地图重排序,java,list,sorting,hashmap,Java,List,Sorting,Hashmap,假设我有两个数据结构,一个有序的字符串列表和一个HashMap。列表如下所示: types = ["string", "integer", "boolean", "integer"]; map = {2=integer, true=boolean, 7=integer, "dog"=string}; HashMap带有一个对象键和一个字符串值,如下所示: types = ["string", "integer", "boolean", "integer"]; map = {2=intege

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

types = ["string", "integer", "boolean", "integer"];
map = {2=integer, true=boolean, 7=integer, "dog"=string};
HashMap带有一个对象键和一个字符串值,如下所示:

types = ["string", "integer", "boolean", "integer"];
map = {2=integer, true=boolean, 7=integer, "dog"=string};
重新组织地图“顺序”的最简单/最有效的方法是什么,以使地图的值与列表的顺序一致,即地图在打印时的外观如下:

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

HashMap
不提供订单保证。从:

此类不保证地图的顺序;特别是,它不能保证订单在一段时间内保持不变

因此,如果您想要一个有序的
映射
,通常需要从
SortedMap
()的实现开始

遗憾的是,<代码> SortedMap < /代码>按键值排序,并且您希望按值排序,所以您将不得不查看第三方集合库,或考虑“<代码> LinkedHashMap < /C> >(),即使它不维护排序,也具有可预测的迭代顺序。


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

构建一个反向哈希映射,如下所示

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

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

reversedmap = {integer=[2,7], boolean=true, string=dog};
然后遍历列表并从reversedmap中获取相应的键

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

编辑:感谢@Federicoperalthaffner指出这一点


如果从reversedmap中获得两个值(例如,对于“integer”元素),则可以选择其中一个(不管是哪一个)插入LinkedHashMap,同时随后将其从reversedmap中删除。然后你进入类型列表中的下一个元素

,它看起来可能很麻烦,并且可能需要至少一个额外的映射…类型列表是否总是与预期的排序映射大小相同?@Federicoperaltachaffner Yep;每个都要求大小相同。很好@然后,从原来的HASMAP中获得所有的键值对,按值排序,然后把它们放在一个Link KeHMAP或SoRead MaPoTebug中,在这个例子中,有两个“代码>整数< /代码>值在排序中,一个在中间,一个在结尾——哪个整数应该是哪个?@ FedericoPeraltaSchaffner,我写了一个答案。你可以建立一个反向的地图,然后proceed@GeoffreyWiseman,在两个整数的情况下,顺序并不重要。我将两个整数放在那里只是为了有多个相同类型的值-我可以很容易地添加第二个字符串或布尔值。但就我所问的问题而言,相同类型的订单并不特别重要——在重新排序中,7可以很容易地排在2之前——只要每个订单都放在一个整数“槽中”。@FedericoPeraltaSchaffner,谢谢:)。但是我不明白你对最后部分的建议。请你详细说明一下好吗?对不起,我弄糊涂了,每个列表中元素的顺序并不重要。但是一旦你把一个元素放到地图上,你就需要从列表中删除它,所以下次当有一个相同类型的元素放到地图上时,你只需要从列表中选择另一个。@FedericoPeraltaSchaffner,ohk。事实上,但我认为即使这样也不是必需的。一旦从reversedmap获得多个值,只有在将所有可能的键值对插入LinkedHashMapNo后才能继续,您必须遵守
类型
列表的遭遇顺序。对于问题中的示例,您首先在
类型
列表中找到
(string,[dog])
,然后转到反向映射,将
(dog,string)
放入
链接地图
,并从反向映射的值列表中删除
dog
类型
列表中的下一个元素是
整数
,您可以在反向映射中找到
(整数[2,7])
。在这里,您应该选择
2
7
并将其删除。假设您已经拾取并删除了
2
,那么将
(2,整数)
放在
LinkedHashMap
中。然后继续使用
boolean
,然后再次使用
integer
。@FedericoPeraltaSchaffner,Ohk。。。现在明白了:)。。。谢谢