【问题标题】:how can i get value through complex logic from list我如何通过列表中的复杂逻辑获得价值
【发布时间】:2017-05-16 13:56:44
【问题描述】:

我有过滤器personCountFilter=3,列表如下:

Rate{ PersonCount:1, LOS:1}
Rate{ PersonCount:1, LOS:2}
Rate{ PersonCount:1, LOS:3}
Rate{ PersonCount:2, LOS:1}
Rate{ PersonCount:2, LOS:2}
Rate{ PersonCount:2, LOS:3}
Rate{ PersonCount:3, LOS:2}
Rate{ PersonCount:3, LOS:4}
Rate{ PersonCount:3, LOS:5}
Rate{ PersonCount:3, LOS:6}
Rate{ PersonCount:4, LOS:3}
Rate{ PersonCount:5, LOS:7}
Rate{ PersonCount:6, LOS:7}

过滤后我的预期:

Rate{ PersonCount:2, LOS:1}
Rate{ PersonCount:3, LOS:2}
Rate{ PersonCount:4, LOS:3}
Rate{ PersonCount:3, LOS:4}
Rate{ PersonCount:3, LOS:5}
Rate{ PersonCount:3, LOS:6}
Rate{ PersonCount:5, LOS:7}

按LOS分组后如何获取值,如果personCount匹配过滤器得到这个,如果不匹配,则最接近personCountFilter,首先是更大的personCountFilter

我尝试使用

HashSet<Rate> testSet = rates.stream()
                .collect(Collectors.collectingAndThen(
                        Collectors.toMap(Rate::getLengthOfStayCount,
                                Function.identity(),
                                (previous, current) ->
                                {
                                    return previous.getPersonCount() > 
                                           current.getPersonCount() ? previous : current;
                                }),
                        map ->
                        {
                            HashSet<Rate> set = new HashSet<>();
                            set.addAll(map.values());
                            return set;
                        }));

但它会返回

Rate{ PersonCount:2, LOS:1}
Rate{ PersonCount:3, LOS:2}
Rate{ PersonCount:4, LOS:3}
Rate{ PersonCount:3, LOS:4}
Rate{ PersonCount:3, LOS:5}
Rate{ PersonCount:3, LOS:6}
Rate{ PersonCount:6, LOS:7}

当前按 LOS 分组后获得最大 personCount

【问题讨论】:

  • 你能把问题说得更清楚吗.. 我不明白预期的内容:确切地说,我不明白“如果 personCount 匹配过滤器得到这个,如果不匹配,与 personCountFilter 最接近,更大的 personCountFilter 优先”

标签: java java-8 java-stream


【解决方案1】:

我无法使用您在问题中提供的信息测试以下代码(了解如何制作 Minimal, Complete, and Verifiable example 你的下一个问题),但我认为这样的事情应该适合你:

HashSet<Rate> testSet = rates.stream()
        .collect(Collectors.collectingAndThen(
                Collectors.toMap(Rate::getLengthOfStayCount,
                        Function.identity(),
                        (previous, current) ->
                        {
                            int diff1 = Math.abs(personCountFilter - previous.getPersonCount());
                            int diff2 = Math.abs(personCountFilter - current.getPersonCount());
                            if (diff1 > diff2) {
                                return current;
                            } else if (diff1 < diff2) {
                                return previous;
                            } else if (diff1 == diff2) {
                                return previous.getPersonCount() <= current.getPersonCount() ? current : previous;
                            }
                        }),
                map -> new HashSet<>(map.values())
                    ));

【讨论】:

    【解决方案2】:

    如果我对您的理解正确,您希望获取每个组的元素,它具有最接近数字 3personCount 属性,如果出现平局,则优先选择较高的数字。

    你可以使用

    HashSet<Rate> testSet = rates.stream()
        .collect(Collectors.collectingAndThen(
            Collectors.toMap(Rate::getLengthOfStayCount,
                    Function.identity(),
                    BinaryOperator.minBy(
                       Comparator.comparingDouble(rate -> Math.abs(rate.getPersonCount()-3.1)))
            ),
            map -> new HashSet<>(map.values())
        ));
    

    Math.abs(rate.getPersonCount()-3) 是到您的目标编号3 的距离,获取具有该值最小值的元素将获得最接近的值。通过简单地使用3.1 而不是3,我们可以在出现平局的情况下优先选择更高的数字(假设您的属性具有整数类型)。

    【讨论】:

      猜你喜欢
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 2010-10-12
      相关资源
      最近更新 更多