Java按最高值排序,然后按最低键排序HashMap

时间:2020-06-08 04:34:39

标签: java hashmap

可以说我有一个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())来获得最大的价值,但是我怎么才能找到柠檬和糖总和最少的最大价值?

2 个答案:

答案 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元素。

比较器逻辑如下:

  1. 它按地图的值排序。
  2. 如果是平局,则按食谱中柠檬和糖的总和进行反向排序。这意味着这些值将从最大到最小排序。

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);