可以说我有一个HashMap<Recipe, Integer>
,其中Recipe是带有2个整数参数的类。我们可以称它们为柠檬和糖。我想在HashMap中获取具有最高对应值的键(这是一个配方)。作为辅助排序方法,如果它包含多个具有相同值的食谱。它应该以最小的糖和柠檬的总和返回食谱。
例如
HashMap<Recipe, Integer> recipes = new HashMap<>();
recipes.put(new Recipe(5, 3), 10); // 5 is lemons, 3 is sugar
recipes.put(new Recipe(8, 8), 15);
recipes.put(new Recipe(1, 2), 15);
Recipe bestRecipe - recipes.getBestRecipe();
// bestRecipe.getLemons() would be 1
// bestRecipe.getSugar() would be 2
// because it has the highest value (15) with the lowest sum of sugar and lemons (1+2=3)
我该怎么做呢?我知道我可以用Collections.max(recipes.values())来获得最大的价值,但是我怎么才能找到柠檬和糖总和最少的最大价值?
答案 0 :(得分:2)
您可以流式传输地图并编写比较器进行排序,然后获取第一个元素
recipes.entrySet().stream()
.sorted((e1, e2) -> {
int v = e2.getValue().compareTo(e1.getValue());
if(v!=0) return v;
Integer a = (e1.getKey().getLemons() + e1.getKey().getSuger());
Integer b = (e2.getKey().getLemons() + e2.getKey().getSuger());
return Integer.compare(a,b);
})
.map(Map.Entry::getKey)
.findFirst().get();
答案 1 :(得分:2)
您可以创建映射条目的流,并使用max
方法来获取由比较器排序的max元素。
比较器逻辑如下:
Optional<Recipe> bestRecipe = recipes.entrySet()
.stream()
.max(Comparator.comparingInt((Map.Entry<Recipe, Integer> e) -> e.getValue())
.thenComparing(e -> e.getKey().getSugar() + e.getKey().getLemons(),
Comparator.reverseOrder()))
.map(Map.Entry::getKey);