按照哈希映射的值(通过映射值进行比较)对哈希映射的数组列表进行排序。

3

我的清单大致如下

List<Map<CustomClass,Integer>> sampleList = new ArrayList<>();

这里,每个自定义类都与一个值关联。其中,类被视为键,与之相关联的值是地图的值。我可以有多个键具有相同的值。

例如:

List<Map<CustomClass,Integer>> sampleList = new ArrayList<>();


CustomClass a1 = new CustomClass();
CustomClass a2 = new CustomClass();

CustomClass b1 = new CustomClass();
CustomClass b2 = new CustomClass();

Map<CustomClass, Integer> map1 = new HashMap();
map1.put(a1,3);
map1.put(a2,3);

Map<CustomClass, Integer> map2 = new HashMap();
map2.put(b1,2);
map2.put(b2,2);

sampleList.add(map1);
sampleList.add(map2);

现在我希望最终排序后的列表为{b1,b2,a1,a2},即根据整数值进行排序。


4
你正在对什么进行排序?列表还是映射?实现一个键可以拥有多个值的场景的传统方法是使用列表的映射,而不是映射的列表... - Robby Cornelissen
1
@RobbyCornelissen 很好的问题。乍一看,我以为列表有四个地图,每个地图都有一个键值条目。但是后来我发现列表只有一个单独的地图,而且其中有四个键值对。如果需要对地图进行排序,则需要使用不同于HashMap的东西,因为它们没有顺序。如果需要对列表进行排序,那么如果您有多个地图,每个地图中有多个条目,准确的标准是什么? - VLAZ
1
@RobbyCornelissen 我认为你是对的。看起来这就是 OP 所追求的。 - geanakuch
@VLAZ:感谢您建议使用multimaps。我会尝试它们。 - gayu312
1
@gayu312 地图的键始终具有相同的值吗?还是可以进行map1.set(a1, 1); map1.set(a2, 4);以及map2.set(b1, 2); map2.set(b2, 3);?如果可能的话,那么如何排序?按最小值?按最大值?还是其他什么? - VLAZ
显示剩余2条评论
1个回答

2
你可以使用流来展平地图并按值排序:
List<CustomClass> result = sampleList.stream()
        .map(Map::entrySet)
        .flatMap(Set::stream)
        .sorted(Entry.comparingByValue())
        .map(Entry::getKey)
        .collect(Collectors.toList());

但是我在这里尝试对列表进行排序而不是地图,但是列表必须根据地图的值进行排序。 - gayu312
这是按值排序的。 - shmosel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接