我有一个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()
答案 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;
}