gpt4 book ai didi

java - 如何过滤 TreeMap>> ,

转载 作者:行者123 更新时间:2023-12-03 19:02:38 24 4
gpt4 key购买 nike

FundingRank 和 SourceBucket 是枚举,但本质上是 int

enum FundingRank {
LESS_THAN_0(0),
LESS_THAN_1(1),
LESS_THAN_100(100);

private final int rank;
FundingRank(int i) {
this.rank = i;
}
}

enum ScoreBucket {
MORE_THAN_1000(1000),
MORE_THAN_500(1000),
MORE_THAN_100(100),
MORE_THAN_10(10);

private final int bucket;
ScoreBucket(int i) {
this.bucket = i;
}
}
我有一个 TreeMap<FundingRank, TreeMap<scoreBucket, List<Kids>> >持有数据,如
fundingRank  scoreBucket List<Kids>
0 1000 List(with 1 elements)
500 List(with 2 elements)
100 List(with 4 elements)
10 List(with 3 elements)
1 1000 List(with 4 elements)
500 List(with 7 elements)
100 List(with 4 elements)
10 List(with 3 elements)
现在我想找到元素最小值 fundingRank最大 scoreBucket至少有 5 个 child ,如果没有,则最少 fundingRank最大 scoreBucket
 myMap.entrySet().stream()
.filter(e -> e.getvalue().entryset().stream()
.filter(e2 ->e2.getvalue().size()).findfirst();


Output sorted map like this:

1 500 List(with 7 elements)
0 100 List(with 4 elements)
1 1000 List(with 4 elements)
1 100 List(with 4 elements)
0 10 List(with 3 elements)
...
所以,我试图对 TreeMap > 进行排序,排序顺序定义为 MinFunding rank 和 max ScoreBucket(阈值为 5,如果桶有 5 个 child ,这意味着是否还有其他较小的桶 child 越多,得分越高的桶获胜,或者如果有更大的 FundingRank,桶的大小和 child 更多,如果满足 5 个 child 的阈值,则资金较低的桶行仍然获胜),然后拿起第一行
希望现在清楚了

最佳答案

如果您想找到 [fundingRank, scoreBucket, list_Kids]三胞胎与 min FundingRank和最大 ScoreBucket ,但仅考虑超过 5 个 child 的三胞胎,您可以流式传输外部和内部 map 的条目并使用自定义 Comparator找到它:

Optional<Map.Entry<FundingRank, Map.Entry<ScoreBucket, Integer>>> triplet = 
outerMap.entrySet().stream()
.flatMap(outerEntry -> outerEntry.getValue().entrySet().stream()
.map(innerEntry -> Map.entry(
outerEntry.getKey(),
Map.entry(innerEntry.getKey(), innerEntry.getValue().size()))))
.min(Comparator.comparingInt(t -> t.getValue().getValue() >= 5 ? 0 : 1)
.thenComparing(t -> t.getKey())
.thenComparing(t -> t.getValue().getKey(), Comparator.reverseOrder())
.thenComparing(t -> t.getValue().getValue(), Comparator.reverseOrder()));

triplet.ifPresent(it -> /* do something with the triplet */);
这将创建三元组 Map.Entry<FundingRank, Map.Entry<ScoreBucket, Integer>>并根据给定的 Comparator 找到最小三元组,(我希望)满足您的要求。
我们正在使用 Comparator Stream.min 首先按 0 排序或 1 ,这是一个标志,指定是否有超过 5 个 child 。这个标志是 0如果有超过 5 个 child ,那么首先出现超过 5 个 child 的三胞胎。然后,比较器按 FundingRank 排序升序,然后由 ScoreBucket下降,最后,如果有平局,则会被下降的 child 的实际数量打破(以防万一)。
这里我使用了 Java 9+ 的 Map.entry(...) 创建条目的方法。如果您使用的是 Java 8,您应该使用 new AbstractMap.SimpleEntry(...) 创建条目.

关于java - 如何过滤 TreeMap<MyKey, Map<Key2,List<Kids>>> ,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64364337/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com