对以对象为键,整数为值的哈希图进行排序

时间:2019-06-07 10:01:17

标签: java sorting hashmap

我有一个Hashmap,其中包含一个对象Customer作为键,并包含一个整数“产品数量”作为值。

我想从此哈希图中获取产品数量最少的客户对象。

我使用流尝试了两种方法,但似乎总是得到随机对象,而不是具有最低int值的对象。

有人可以帮忙吗?

Map<Customer, Integer> customerMap = new HashMap<>();

    for (Customer customer:customers) {
        customerMap.put(customer, customer.getProducts().size());
    }

customerMap.entrySet().stream()
  .sorted(Map.Entry.comparingByValue(Comparator.naturalOrder()))
  .findFirst().get().getKey()

customerMap.entrySet().stream()
  .min(Map.Entry.comparingByValue(Integer::compareTo))
  .get().getKey()

2 个答案:

答案 0 :(得分:1)

如果您只想查找值最小的键,则不必对集合进行排序。

如果您确定只有一个键值最小(可能更多),则可以执行以下操作:

Customer customerWithSmallestValue = map.entrySet().stream()
                                        .min(Comparator.comparingInt(Map.Entry::getValue))
                                        .map(Map.Entry::getKey)
                                        .get();

或者

Customer customerWithSmallestValue = map.entrySet().stream()
                                        .min(Map.Entry.comparingByValue(Integer::compareTo))
                                        .map(Map.Entry::getKey)
                                        .get();
  

请注意,如果有多个键在地图中具有最小的值,则这两个选项将为您提供最后发现的结果

答案 1 :(得分:0)

我看不到您的问题,当我测试您的代码时,它会同时返回两个流正确的Customer

不使用Map来获得结果的2种其他方法是:

1-按照products列表大小对客户列表进行排序,并采用第一个:(如Maia所指出的那样)

customers.sort(Comparator.comparing(cu -> cu.getProducts().size()));
Customer c = customers.get(0);

2-使用经典的for循环:

Customer c = customers.get(0);
for(Customer cu : customers) {
    if(cu.getProducts().size() < c.getProducts().size())
        c = cu;
}