gpt4 book ai didi

Java 8 流/收集器通过映射进行分组

转载 作者:行者123 更新时间:2023-11-30 02:50:15 26 4
gpt4 key购买 nike

我有两张 map

  1. scoreMap<String,Float>以组名作为键及其得分作为值
  2. thresholdMap<Float,String>有一个阈值 作为关键且相关的评论作为值(value)。
  3. 我需要想出 Map<String,List<String>>由此。读作 Map<comment,List
    of groups its applicable to>
    Map<group, comment>也不错。

逻辑很简单,就是取 score来自scoresMap ,并将其与 threshold 进行比较在threshold map 。根据它所处的位置(即高于“高”、介于“高”和“中”之间或低于“中”),从 thresholdMap 中选择相关评论。

大概是这样的:

BiFunction<Map<String,Float>, Map<Float,String>, Map<String,String>> or
BiFunction<Map<String,Float>, Map<Float,String>, Map<String,List<String>>>

我还没想好怎么办 groupingBy使用Predicate检查 3 个条件,因此很抱歉没有其他样本 Stream代码!非流代码如下所示(不使用 map ):

if(orgScorePct >= HI_THRESHOLD) 
return "ORG_HI_SCORE_COMMENT";
if(orgScorePct < HI_THRESHOLD && orgScorePct > MED_THRESHOLD)
return "ORG_MED_SCORE_COMMENT";
return "ORG_LOW_SCORE_COMMENT";

最佳答案

首先,使用 TreeMap 作为阈值会更容易:因为它是键上的排序映射,所以确定给定值的正确阈值注释很简单获取 floorEntry 的问题对于这个值。天花板条目对应于具有紧邻给定键下方的键的条目。同样,有ceilingEntry检索具有紧随给定 key 之后的 key 的条目。

考虑到这一点,我们可以得到以下内容(带有示例数据):

Map<String,Float> scoreMap = new HashMap<>();
TreeMap<Float,String> thresholdMap = new TreeMap<>();

scoreMap.put("name1", 1.0f);
scoreMap.put("name2", 2.0f);
scoreMap.put("name3", 3.0f);
scoreMap.put("name4", 5.0f);

thresholdMap.put(0.5f, "comment0");
thresholdMap.put(1.5f, "comment1");
thresholdMap.put(4.5f, "comment2");

Map<String,List<String>> result =
scoreMap.entrySet()
.stream()
.collect(Collectors.groupingBy(
e -> thresholdMap.floorEntry(e.getValue()).getValue(),
Collectors.mapping(Map.Entry::getKey, Collectors.toList())
));

这会产生正确的 {comment2=[name4], comment1=[name3, name2], comment0=[name1]}:“comment2”的阈值 为 4.5,只有 "name4" 的分数高于该值; "comment1" 的阈值是 1.5,"name2""name3" 的分数都在 1.5 到 4.5 之间,等等。

如果没有楼层条目,请小心:可能是分数没有相应的阈值;例如,在上面的数据中,得分为 0 就会出现问题。要处理这种情况,您需要检查 floorEntry 是否返回 null 并通过返回默认值进行相应处理。

关于Java 8 流/收集器通过映射进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38916566/

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