根据地图值将 Java 地图转换为有序集合

Converting Java map into ordered collection based on map values

请注意:我看到这个问题出现类似于this one但是在那个问题中,它们只是排序一张地图。在这里,我需要从地图中提取键及其值,对它们进行排序并将它们按顺序放入另一个集合中。并且该集合必须是可流式的,并按照排序方法放置元素的顺序呈现该流的元素。


Java 11 在这里。我有以下 POJO:

@Data // lombok generates ctor, getters, setters, etc.
public class Answer {
    private String text;
    // ... many other fields here, omitted for brevity
}

我有一个 Map<Answer,Integer> 表示每个 Answer 数量 个实例,例如:

Map<Answer,Integer> answerCounts = new HashMap<>();
answerCounts.put(answer1, 14); // answer #1 occurs 14 times
answerCounts.put(answer2, 7);
answerCounts.put(answer3, 239);
answerCounts.put(answer4, 7);
answerCounts.put(answer5, 54);
answerCounts.put(answer6, 2);

我想将此地图转换为一个集合(可能是 ListSet),其中 Answer 元素根据其在地图中的计数值进行排序。在“ties”的情况下(两个映射键具有相同的计数值)那么 Answer 元素出现的顺序并不重要,只要它们根据其他非 - 正确排序即可绑定元素。

所以使用上面的地图示例,我希望此转换的输出是 list/set,它按以下顺序提供 Answer 个元素:

  1. 答案 #3(计数 = 239)
  2. 答案 #5(计数 = 54)
  3. 答案 #1(计数 = 14)
  4. 答案 #2(计数 = 7)
  5. 回答 #4(计数 = 7)(<-- #2 和 #4 的计数相同,所以它们各自的顺序对我来说无关紧要)
  6. 答案 #6(计数 = 2)

知道如何完成这个吗? objective 是要有一个集合,然后我可以流式传输 (someCollection.stream()...) 和处理元素按照它们在“计数地图”中的显示顺序。

使用 LinkedHashMap 而不是 Map。不同的是,第一个是有顺序的,所以当你对它进行排序时,它会保持排序状态(直到你修改或添加新元素)

顺便说一句,您可以通过地图流式传输

answerCounts.entrySet()
  .stream()
  .sorted(Map.Entry.comparingByValue())
  .forEach(System.out::println);

这将对 Map 进行排序,但顺序错误,我找不到反转它的方法