英文:
How to find max key with some conditions in HashMap using Java 8 / Streams?
问题
假设我有以下数据:
问题:
- 我想找到 Pair 为 'AB'、OrderType 为 'Buy' 且状态为 'InProgress' 的最大 orderId 的 zscore。
注意:我将这些数据存储在名为 orderBook 的 HashMap 中,其中键是 orderId,值是 OrderModel(PairName、OrderType、Status、zscore)。
解决方案 1:
int maxOrderId = 0;
getOrderBook().entrySet().stream()
.filter(e -> e.getValue().getPairName().equals("AB")
&& e.getValue().getCompletedStatus().equals("InProgress")
&& e.getValue().getOrderType().equals("Buy"))
.forEach(o -> {
if (maxOrderId < o.getKey()) {
maxOrderId = o.getKey();
}
});
double zscore = getOrderBook().get(maxOrderId).getzScore();
System.out.println("Order ID :" + maxOrderId + ", Zscore :" + zscore);
输出:Order ID : 5, Zscore : -2.5
我可以使用上述代码找到 zscore,但我希望一次性找到。那么,如何使用 Java 8 / streams 在一行中找到最大 OrderId 的 zscore?
是否有比我的代码更好的方法?
英文:
Suppose I have following data :
Question :
- I want to find zscore of largest orderId where Pair is 'AB', OrderType is 'Buy' and status is 'InProgress'.
NOTE: I stored this data into HashMap name is orderBook where Key is orderId and Value is OrderModel (PairName, OrderType, Status, zscore).
Solution 1 :
int maxOrderId = 0 ;
getOrderBook().entrySet().stream()
.filter(e -> e.getValue().getPairName().equals("AB")
&& e.getValue().getCompletedStatus().equals("InProgress")
&& e.getValue().getOrderType().equals("Buy"))
.forEach(o -> {
if (maxOrderId < o.getKey()) {
maxOrderId = o.getKey();
}
});
double zscore = getOrderBook().get(maxOrderId).getzScore();
System.out.println("Order ID :"+ maxOrderId +", Zscore :"+zscore);
output : Order ID : 5, Zscore : -2.5
I can find zscore using above code but I want to find in one go.
So How can I find the zscore of largest OrderId using Java 8 / streams in one line ?
Is there any better way than my code ?
答案1
得分: 5
你要寻找的是 max
方法:
Optional<Entry<Long, Order>> maxIdEntry = getOrderBook()
.entrySet()
.stream()
.filter(/* 你的筛选逻辑 */)
.max(Comparator.comparing(Entry::getKey));
这会得到一个 Optional,因此可以使用 isPresent()
和 get()
方法,或者使用 ifPresent(Consumer<T> consumer)
方法来处理结果。
英文:
What you're looking for is the max
method:
Optional<Entry<Long,Order>> maxIdEntry = getOrderBook()
.entrySet()
.stream()
.filter(/* your filter logic */)
.max(Comparator.comparing(Entry::getKey));
This yields an Optional, so either use the isPresent()
and get()
methods or the ifPresent(Consumer<T> consumer)
method for processing the result
答案2
得分: 2
你可以使用Comparator
来使用max()
函数获取最大的OrderId,并使用Optional
的map
来映射zScore
。
double zscore = getOrderBook()
.entrySet()
.stream()
.filter(e -> e.getValue().getPairName().equals("AB")
&& e.getValue().getCompletedStatus().equals("InProgress")
&& e.getValue().getOrderType().equals("Buy"))
.max(Comparator.comparing(Entry::getKey))
.map(e -> e.getValue().getzScore())
.orElse(0);
英文:
You can use max()
using Comparator
to get largest OrderId and use map
of Optional
to map zScore
.
double zscore = getOrderBook()
.entrySet()
.stream()
.filter(e -> e.getValue().getPairName().equals("AB")
&& e.getValue().getCompletedStatus().equals("InProgress")
&& e.getValue().getOrderType().equals("Buy"))
.max(Comparator.comparing(Entry::getKey))
.map(e -> e.getValue().getzScore())
.orElse(0);
答案3
得分: 2
已有的答案非常出色。还有更多的方法:
使用TreeMap
怎么样?它能够保持键的排序。只要键是例如String
,甚至不需要传递Comparator
。
// 将HashMap复制为TreeMap
NavigableMap<String, Order> navigableMap = new TreeMap<>(getOrderBook());
// 删除不需要的条目(反转条件)
navigableMap.entrySet().removeIf(e ->
!e.getValue().getPairName().equals("AB") ||
!e.getValue().getCompletedStatus().equals("InProgress") ||
!e.getValue().getOrderType().equals("Buy"));
// NavigableMap::lastEntry 获取具有最高键的条目(通过比较器)
double zscore = sortedMap.lastEntry().getValue().getzScore();
英文:
The already existing answer are excellent. There are more ways:
How about using TreeMap
which is able to keep the keys sorted? As long as the key is ex. a String
, you don't even need to pass a Comparator
.
// create a copy of HashMap as a TreeMap
NavigableMap<String, Order> navigableMap = new TreeMap<>(getOrderBook());
// remove unwanted entries (inverted condition)
navigableMap.entrySet().removeIf(e ->
!e.getValue().getPairName().equals("AB") ||
!e.getValue().getCompletedStatus().equals("InProgress") ||
!e.getValue().getOrderType().equals("Buy"));
// NavigableMap::lastEntry gets an entry with the highest key (by the comparator)
double zscore = sortedMap.lastEntry().getValue().getzScore();
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论