将Java映射转换为基于映射值的有序集合



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


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元素根据它们在映射中的计数值进行排序。在";领带";(其中两个映射键具有相同的计数值(,那么Answer元素的出现顺序并不重要,只要它们根据其他非绑定元素正确排序即可。

因此,使用上面的映射示例,我希望这个转换的输出是一个列表/集合,它按以下顺序提供Answer元素:

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

知道我该怎么做吗目标是拥有一个集合,然后我可以流式传输(someCollection.stream()...(并按照元素在";计数映射";。

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

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

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

这会对地图进行排序,但顺序不对,我找不到反转的方法

最新更新