如何在java中对其他映射中的一组映射进行排序?
我对由地图组成的复杂对象中的标签排序有问题如何在java中对其他映射中的一组映射进行排序?,java,sorting,collections,Java,Sorting,Collections,我对由地图组成的复杂对象中的标签排序有问题 Map<Class<? extends Fiche>, Map<String, Map<Family, Set<Map<ObjectField, DetailsField>>>>> Fields = new HashMap<>(); Map您使用的数据模型可以表示为: A -> B -> C -> [D -> E] 你的问题是如何按D排序。鉴
Map<Class<? extends Fiche>, Map<String, Map<Family, Set<Map<ObjectField, DetailsField>>>>> Fields = new HashMap<>();
Map您使用的数据模型可以表示为:
A -> B -> C -> [D -> E]
你的问题是如何按D
排序。鉴于D
在您的结构中有四个层次,您需要为A
、B
和C
提供键,以便能够找到D->E
映射的集合进行排序。这没有什么神奇之处:如果没有前三个值,你就无法进入第三级-这是地图的本质
一旦有了集合
,按D
排序可以解释为按D
的自然顺序迭代所有(D,E)
对。这可以通过以下方式实现:
Set<Map<D,E>> setOfMaps;
setOfMaps.stream()
.flatMap(map -> map.entrySet().stream())
.sorted(Map.Entry.comparingByKey())
...
设置一组映射;
setOfMaps.stream()
.flatMap(map->map.entrySet().stream())
.sorted(Map.Entry.comparingByKey())
...
这将生成一个流
,然后您可以根据需要使用forEach
或收集器对其进行处理
作为注释,如果将数据结构的某些部分封装在类中,而不是完全依赖于集合,那么代码可能会更清晰 您正在使用的数据模型可以表示为:
A -> B -> C -> [D -> E]
你的问题是如何按D
排序。鉴于D
在您的结构中有四个层次,您需要为A
、B
和C
提供键,以便能够找到D->E
映射的集合进行排序。这没有什么神奇之处:如果没有前三个值,你就无法进入第三级-这是地图的本质
一旦有了集合
,按D
排序可以解释为按D
的自然顺序迭代所有(D,E)
对。这可以通过以下方式实现:
Set<Map<D,E>> setOfMaps;
setOfMaps.stream()
.flatMap(map -> map.entrySet().stream())
.sorted(Map.Entry.comparingByKey())
...
设置一组映射;
setOfMaps.stream()
.flatMap(map->map.entrySet().stream())
.sorted(Map.Entry.comparingByKey())
...
这将生成一个流
,然后您可以根据需要使用forEach
或收集器对其进行处理
作为注释,如果将数据结构的某些部分封装在类中,而不是完全依赖于集合,那么代码可能会更清晰 要按字母顺序在地图中存储数据吗?Java就是为了这个。TreeMap和HashMap的使用基本相同,但它们存储内部信息的方式略有不同。您只需更改初始值设定项即可保持代码的编译。是否要按字母顺序在地图中存储数据?Java就是为了这个。TreeMap和HashMap的使用基本相同,但它们存储内部信息的方式略有不同。您只需更改初始值设定项即可保持代码的编译。HashMap通常不适合对元素进行排序,因为它使用自己的算法来确定存储位置。我想知道您是否应该为此创建一个新的数据结构。某种程度的抽象。似乎您的参数化类型让您感到困惑。@MaxZoom我完全同意您的看法,我正在考虑用树形图替换最后一个贴图,但我不确定代码上是否没有任何imact。@user489041这就是问题所在,旧代码是用来显示所有数据的,现在我应该对这些数据进行排序。HashMap通常是一个不好的元素排序选择,因为它使用自己的算法来决定存储位置。我想知道你是否应该在今年创建一个新的数据结构。某种程度的抽象。似乎您的参数化类型让您感到困惑。@MaxZoom我完全同意您的看法,我正在考虑用树形图替换最后一个贴图,但我不确定代码上是否没有任何imact。@user489041这就是问题所在,旧代码是用来显示所有数据的,现在我应该对这些数据进行排序。它不是同一个规范,但键是一个枚举,包含许多变量,我想根据这个枚举的id对键(枚举)进行排序,可能吗?您可以尝试创建一个映射来对枚举进行排序。向映射添加值,如mapOfValues.put(currEnum.toString(),currEnum)代码>这将为您提供一个按字母顺序排列的枚举及其名称的映射。那肯定会给你一张有条理的地图。还要检查这个问题,它应该有助于更好的想法,但键是一个枚举,它包含许多变量,我想根据这个枚举的id对键(枚举)进行排序,可能吗?您可以尝试创建一个映射来对枚举进行排序。向映射添加值,如mapOfValues.put(currEnum.toString(),currEnum)代码>这将为您提供一个按字母顺序排列的枚举及其名称的映射。那肯定会给你一张有条理的地图。也看看这个问题,它应该会有帮助