根据地图值将 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);
我想将此地图转换为一个集合(可能是 List
或 Set
),其中 Answer
元素根据其在地图中的计数值进行排序。在“ties”的情况下(两个映射键具有相同的计数值)那么 Answer
元素出现的顺序并不重要,只要它们根据其他非 - 正确排序即可绑定元素。
所以使用上面的地图示例,我希望此转换的输出是 list/set,它按以下顺序提供 Answer
个元素:
- 答案 #3(计数 = 239)
- 答案 #5(计数 = 54)
- 答案 #1(计数 = 14)
- 答案 #2(计数 = 7)
- 回答 #4(计数 = 7)(<-- #2 和 #4 的计数相同,所以它们各自的顺序对我来说无关紧要)
- 答案 #6(计数 = 2)
知道如何完成这个吗? objective 是要有一个集合,然后我可以流式传输 (someCollection.stream()...
) 和处理元素按照它们在“计数地图”中的显示顺序。
使用 LinkedHashMap 而不是 Map。不同的是,第一个是有顺序的,所以当你对它进行排序时,它会保持排序状态(直到你修改或添加新元素)
顺便说一句,您可以通过地图流式传输
answerCounts.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue())
.forEach(System.out::println);
这将对 Map 进行排序,但顺序错误,我找不到反转它的方法
请注意:我看到这个问题出现类似于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);
我想将此地图转换为一个集合(可能是 List
或 Set
),其中 Answer
元素根据其在地图中的计数值进行排序。在“ties”的情况下(两个映射键具有相同的计数值)那么 Answer
元素出现的顺序并不重要,只要它们根据其他非 - 正确排序即可绑定元素。
所以使用上面的地图示例,我希望此转换的输出是 list/set,它按以下顺序提供 Answer
个元素:
- 答案 #3(计数 = 239)
- 答案 #5(计数 = 54)
- 答案 #1(计数 = 14)
- 答案 #2(计数 = 7)
- 回答 #4(计数 = 7)(<-- #2 和 #4 的计数相同,所以它们各自的顺序对我来说无关紧要)
- 答案 #6(计数 = 2)
知道如何完成这个吗? objective 是要有一个集合,然后我可以流式传输 (someCollection.stream()...
) 和处理元素按照它们在“计数地图”中的显示顺序。
使用 LinkedHashMap 而不是 Map。不同的是,第一个是有顺序的,所以当你对它进行排序时,它会保持排序状态(直到你修改或添加新元素)
顺便说一句,您可以通过地图流式传输
answerCounts.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue())
.forEach(System.out::println);
这将对 Map 进行排序,但顺序错误,我找不到反转它的方法