当前位置: 首页 > 知识库问答 >
问题:

Java-8用特定范围内的值获取计数

束阳旭
2023-03-14

我有产品列表,希望找到特定成本范围内的产品计数,如,如果productList有10个产品,成本在1-10之间,50在11-100之间,100在101-1000之间,那么它应该返回如下图,

  class Product {
        long id;
        long cost;
        String name;
        //getters setters
    }  
productList.stream().collect(Collectors.toMap(//logic to get map));

共有1个答案

连鸿
2023-03-14

您可以为range创建函数,并使用collectors.groupingby,如下所示,

Map<String, Long> countByCost = productList.stream()
                .collect(Collectors.groupingBy(costRange, TreeMap::new, Collectors.counting()));

Function<Product, String> costRange = ele -> {
        if(ele.cost >= 1 && ele.cost < 11)
            return "1-10";
        if(ele.cost >= 11 && ele.cost < 101)
            return "11-100";
        if(ele.cost >= 101 && ele.cost < 1001)
            return "101-1000";
        return "others";
 };

更新:Holger建议的更优雅的成本范围功能,

Function<Product, String> costRange = ele -> {
 if(ele.cost < 1) return "others"; 
long i = ele.cost == 1? 1: (long)Math.pow(10, Math.floor(Math.log10(ele.cost-1))); 
return (i|1)+"-"+(i*10); };
 类似资料:
  • 问题内容: 假设我有一张Java地图,看起来像这样: 如果键按排序顺序(使用树图或链接哈希图)。现在,如果我尝试获取> = 39和<41的值。那么我应该获取字符串“ 39至41”。如何有效地执行此操作? 问题答案: 看起来您想要的不止一个; 你想要一个!具体来说,您可以使用该操作。 这是一个例子: 需要注意的是也有,,和也,而不是操作以及它返回而不只是。

  • 问题内容: 我有一个带有id列和成千上万行的表。我获得了1000个ID的列表,用于对照其他表格数据进行检查。 ID没有按顺序存储。 ID列表也不按顺序排列。 当我使用这些ID选择表格数据时,仅返回990个结果,这意味着自该列表产生以来,其中10个结果已更改/被删除。如何从该数据范围中找到10个缺失值?这是我目前正在做的事情: 返回990个结果。我可以做类似的事情吗? 编辑:抱歉造成混乱。我应该提到

  • 我是Elasticsearch的新手,所以我怀疑: 我在弹性搜索中插入了大量数据。我插入的数据包含每个科目的分数属性,是否可以编写Elasticsearch查询来查找分数在输入范围内的学生人数 例子: 假设以表格方式存在于ES中的数据,是否有可能 1.找到计算机成绩超过50分的学生名单。 2、查找两门科目得分均超过60分的学生名单。

  • 问题内容: 有没有办法获取所有当前在javascript范围内的变量? 问题答案: 否。“范围内”变量由“作用域链”确定,该变量无法通过编程方式访问。 有关详细信息(很多),请查看ECMAScript(JavaScript)规范。这是指向官方页面的链接,您可以在其中下载规范规范(PDF),而这是指向官方的可链接HTML版本的链接。 根据您对Camsoft的评论进行更新 事件函数作用 域中 的变量取

  • 我的方法是生成所有素数直到(埃拉托色尼筛),并检查给定范围内的每个数是否可被素数的平方整除。这些数字的计数从范围的长度中减去,以给出平方自由数。 但是这种方法在复杂度上超时了,请建议一些其他的方法

  • 有没有办法为一系列Int创建IntStream? 就像如果我想流式传输值1到1000,我可以调用一些静态工厂来流式传输该范围?