java8 集合 多字段 分组 统计个数代码

1.user实体

package com.demo.dto;
public class User {
  private Integer id;
  private String userName;
  private String password;
  private Integer age;
  private long c; 

  public User() {
    super();
    // TODO Auto-generated constructor stub
  }

  public User(Integer id, String userName, String password, Integer age) {
    super();
    this.id = id;
    this.userName = userName;
    this.password = password;
    this.age = age;
  }

  public Integer getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  public String getUserName() {
    return userName;
  }

  public void setUserName(String userName) {
    this.userName = userName == null ? null : userName.trim();
  }

  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password == null ? null : password.trim();
  }

  public Integer getAge() {
    return age;
  }

  public void setAge(Integer age) {
    this.age = age;
  }

  public long getC() {
    return c;
  }

  public void setC(long l) {
    this.c = l;
  }

  @Override
  public String toString() {
    return "User [id=" + id + ", userName=" + userName + ", password=" + password + ", age=" + age + ", c=" + c
        + "]";
  }
  public static void main(String[] args) {

    User u1=new User(1, "aa", "aap", 23);
    User u2=new User(2, "aa", "aap", 23);
    User u3=new User(3, "bb", "aap", 23);
    User u4=new User(4, "cc", "aap", 23);
    User u5=new User(5, "cc", "aap", 23);
    User u6=new User(6, "cc", "aap", 23);
    User u7=new User(7, "aa", "aap", 24);
    List<User> list=new ArrayList<User>();
    list.add(u1);list.add(u2);list.add(u7);list.add(u3);list.add(u4);list.add(u5);list.add(u6);
//原有list(根据第二个字段:userName和第四个字段:age 统计重复的记录数)
//jdk8的方法统计个数:
Map<String, Map<Integer, Long>> map = list.stream().collect(Collectors.groupingBy(User::getUserName,Collectors.groupingBy(User::getAge,Collectors.counting())));
//jdk8以下:
    Map<String,Map<Integer,Long>> map=new HashMap<String,Map<Integer,Long>>();
    for (User user1 : list) {
        Map<Integer, Long> value=new HashMap<Integer,Long>();
        long count=0;
        if(map.containsKey(user1.getUserName())){
          continue;
        }
        for(int i=0;i<list.size();i++){
          if(user1.getUserName().equals(list.get(i).getUserName())&&user1.getAge()==list.get(i).getAge()){
            count+=1;
            value.put(user1.getAge(),count);
            map.put(user1.getUserName(), value);
          }else if(user1.getUserName().equals(list.get(i).getUserName())&&user1.getAge()!=list.get(i).getAge()){
            value.put(list.get(i).getAge(),Long.valueOf(1));
            map.put(user1.getUserName(), value);
          }
        }
    }
    map.forEach((k, v) -> {
      System.out.println(k+">>>>"+v);
    });
    List<User> list2=new ArrayList<User>();
    list.forEach(user ->{
      map.forEach((k, v) -> {
        if(k==user.getUserName()){
          Long remove = v.remove(user.getAge());
          user.setC(null==remove?0:remove);
        }
      });
      list2.add(user);
    });
    //遍历最后想要的结果(User中c为统计后的个数,方便前台遍历集合时单元格合并行)
    list2.forEach(u ->{
      System.out.println(u);
    });

  }
}

备注:运行结果如下

cc>>>>{23=3}
bb>>>>{23=1}
aa>>>>{23=2, 24=1}
User [id=1, userName=aa, password=aap, age=23, c=2]
User [id=2, userName=aa, password=aap, age=23, c=0]
User [id=7, userName=aa, password=aap, age=24, c=1]
User [id=3, userName=bb, password=aap, age=23, c=1]
User [id=4, userName=cc, password=aap, age=23, c=3]
User [id=5, userName=cc, password=aap, age=23, c=0]
User [id=6, userName=cc, password=aap, age=23, c=0]

此处是为了实现如下效果:

补充知识:List集合中元素按照固定数量进行分组

最近做项目,被要求将全国所有省份在页面中展示出来,但是要求

1、字少的三个省份占一行

2、字多的两个省份占一行

想来想去只能想到查询出所有省份,然后分组返回数据,上代码

public Map<String,Object> campus_list_provence(HttpServletRequest request,HttpServletResponse response)throws Exception{
		Map<String,Object> map=new HashMap<String,Object>();
		String sql="查询所有省份的名称,可以先在数据库中将全国所有省份建一个表";
		List<String> list=bd.getSQLList(sql);
    //创建第一个list1,里面存入省份名称少于4个字的
		List<String> list1=new ArrayList<String>();
    //创建第二个list2,里面存入省份名称大于4个字的
		List<String> list2=new ArrayList<String>();
		if(list!=null&&list.size()>0){
			for (String string : list) {
				if(string.length()>4){
					list2.add(string);
				}else{
					list1.add(string);
				}
			}
		}
		int keyToken = 0;
		int toIndex=3;
		List<Object> listSortMap = new ArrayList<Object>();
		for(int i = 0;i<list1.size();i+=3){
      if(i+3>list1.size()){    //作用为toIndex最后没有3条数据则剩余几条newList中就装几条
        toIndex=list1.size()-i;
      }
    List newList = list1.subList(i,i+toIndex);
    keyToken++;
    listSortMap.add(newList);
    }
		int keyToken2 = 0;
		List<Object> listSortMap2 = new ArrayList<Object>();
		for(int i = 0;i<list2.size();i+=2){
			if(i+2>list2.size()){    //作用为toIndex最后没有2条数据则剩余几条newList中就装几条
				toIndex=list2.size()-i;
			}
			List newList2 = list2.subList(i,i+toIndex);
			keyToken2++;
			listSortMap2.add(newList2);
		}
		map.put("prov1", listSortMap);
		map.put("prov2", listSortMap2);
		return map;
	}

页面接收

function campus_list_ByProvence(req_data){
	$.ajax({
    type : "POST",
    url : "刚才方法的url",
    traditional: true,
    data : req_data,
    timeout : 20000,
    cache : false,
    beforeSend : function(XMLHttpRequest) {},
    success : function(data) {
    	/* 生成html */
    	$('#campus_list_provence').html(campus_list_ByProvenceHtml1(data.prov1,data.prov2));
    },
    error : function() { alert("ajax失败!");}
	});
}
function campus_list_ByProvenceHtml1(prov,prov2){
	var html = "";
	for(var i = 0 , j = prov.length ; i < j ; i++){
		html+='<li class="li1" >';
		if(prov[i][0]!=undefined&&prov[i][0]!=null&&prov[i][0]!=""){
			var provstr0="'"+prov[i][0]+"'";
			html+='<a href="#2" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="GoToUrlItem('+provstr0+');">'+prov[i][0]+'</a>';
		}else{
			html+='';
		}
		if(prov[i][1]!=undefined&&prov[i][1]!=null&&prov[i][1]!=""){
			var provstr1="'"+prov[i][1]+"'";
			html+='<a href="#2" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="GoToUrlItem('+provstr1+');">'+prov[i][1]+'</a>';
		}else{
			html+='';
		}
		if(prov[i][2]!=undefined&&prov[i][2]!=null&&prov[i][2]!=""){
			var provstr2="'"+prov[i][2]+"'";
			html+='<a href="#2" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="GoToUrlItem('+provstr2+');">'+prov[i][2]+'</a>';
		}else{
			html+='';
		}
		html+='</li>';
	}
	for(var i = 0 , j = prov2.length ; i < j ; i++){
		html+='<li class="li2" >';
		if(prov2[i][0]!=undefined&&prov2[i][0]!=null&&prov2[i][0]!=""){
			var pro2vstr0="'"+prov2[i][0]+"'";
			html+='<a href="#2" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="GoToUrlItem('+pro2vstr0+');">'+prov2[i][0]+'</a>';
		}else{
			html+='';
		}
		if(prov2[i][1]!=undefined&&prov2[i][1]!=null&&prov2[i][1]!=""){
			var prov2str1="'"+prov2[i][1]+"'";
			html+='<a href="#2" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="GoToUrlItem('+prov2str1+');">'+prov2[i][1]+'</a>';
		}else{
			html+='';
		}
		html+='</li>';
	}
	return html ;
}

感觉这样写好麻烦,不过最后还好弄出来了,如果有更好的方法请告诉我一下

页面展示:

以上这篇java8 集合 多字段 分组 统计个数代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • JAVA JDK8 List分组的实现和用法

    概述 对List进行分组是日常开发中,经常遇到的,在JDK 8中对List按照某个属性分组的代码,超级简单. package test; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util

  • java8快速实现List转map 、分组、过滤等操作

    利用java8新特性,可以用简洁高效的代码来实现一些数据处理. 定义1个Apple对象: public class Apple { private Integer id; private String name; private BigDecimal money; private Integer num; public Apple(Integer id, String name, BigDecimal money, Integer num) { this.id = id; this.name =

  • java8实现list集合中按照某一个值相加求和,平均值等操作代码

    集合: List<User> user = new User(); user .stream().collect(Collectors.summingInt(User::getAge)) 参数类型: summarizingDouble 统计数据(double)状态, 其中包括count min max sum和平均值 summarizingInt 统计数据(int)状态, 其中包括count min max sum和平均值 summarizingLong 统计数据(long)状态, 其中包括c

  • java8 集合 多字段 分组 统计个数代码

    1.user实体 package com.demo.dto; public class User { private Integer id; private String userName; private String password; private Integer age; private long c; public User() { super(); // TODO Auto-generated constructor stub } public User(Integer id, S

  • Java8进行多个字段分组统计的实例代码

    Java8进行多个字段分组统计实现代码如下: // 分组统计 Map<String, Long> countMap = records.stream().collect(Collectors.groupingBy(o -> o.getProductType() + "_" + o.getCountry(), Collectors.counting())); List<Record> countRecords = countMap.keySet().stre

  • java中分组统计的三种实现方式

    平时工作中,很多时候都会用到对数据进行分组操作,例如一个学生对象,有班级.名字.性别.分数等,需要按班级分组统计,该怎么操作呢?一个合理的算法可以提升不少效率. 大家看一下下面的案例: //下面是初始化的数据 List<Student> list = new ArrayList<Student>(); Student student1 = new Student("李四1", "女", "一班"); Student stu

  • JAVA8 stream中三个参数的reduce方法对List进行分组统计操作

    背景 平时在编写前端代码时,习惯使用lodash来编写'野生'的JavaScript; lodash提供来一套完整的API对JS对象(Array,Object,Collection等)进行操作,这其中就包括_.groupBy 和 _.reduce,即分组和'聚合'(reduce不知道该怎么翻译合适). 使用这些'野生'的API能够极大的提高我本人编写JS代码的效率.而JAVA8开始支持stream和lambda表达式,这些和lodash的API有很多类似的功能.因此我在熟悉lodash的前提下尝

  • Java8 stream 中利用 groupingBy 进行多字段分组求和案例

    Java8的groupingBy实现集合的分组,类似Mysql的group by分组功能,注意得到的是一个map 对集合按照单个属性分组.分组计数.排序 List<String> items = Arrays.asList("apple", "apple", "banana", "apple", "orange", "banana", "papaya");

  • Django中日期时间型字段进行年月日时分秒分组统计

    1.数据结构说明: 数据结构如下:modification字段为修改数据时间字段,格式为 年,月,日,时,分,秒. 案例场景为,根据modification字段,统计每个统计粒子,产生数据的条数.如需要统计2020年10月29日 每个小时段产生数据的条数. 要进行这种统计需要用到 Django的connection库. 统计年月日粒子用 date_trunc_sql,统计时分秒用 datetime_extract_sql 2.进行年月日粒子的统计  2.1 官方 date_trunc_sql 原

  • postgreSql分组统计数据的实现代码

    1. 背景 比如气象台的气温监控,每半小时上报一条数据,有很多个地方的气温监控,这样数据表里就会有很多地方的不同时间的气温数据 2. 需求: 每次查询只查最新的气温数据按照不同的温度区间来分组查出,比如:高温有多少地方,正常有多少地方,低温有多少地方 3. 构建数据 3.1 创建表结构: -- DROP TABLE public.t_temperature CREATE TABLE public.t_temperature ( id int4 NOT NULL GENERATED ALWAYS

  • JAVA8 STREAM COLLECT GROUPBY分组实例解析

    这篇文章主要介绍了JAVA8 STREAM COLLECT GROUPBY分组实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 实体类People,有个返回list的buildPeopleList方法,方便测试. import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; impo

  • java8 stream多字段排序的实现

    很多情况下sql不好解决的多表查询,临时表分组,排序,尽量用java8新特性stream进行处理 使用java8新特性,下面先来点基础的 List<类> list; 代表某集合 //返回 对象集合以类属性一升序排序 list.stream().sorted(Comparator.comparing(类::属性一)); //返回 对象集合以类属性一降序排序 注意两种写法 list.stream().sorted(Comparator.comparing(类::属性一).reversed());/

  • python DataFrame数据分组统计groupby()函数的使用

    目录 groupby()函数 1. groupby基本用法 1.1 一级分类_分组求和 1.2 二级分类_分组求和 1.3 对DataFrameGroupBy对象列名索引(对指定列统计计算) 2. 对分组数据进行迭代 2.1 对一级分类的DataFrameGroupBy对象进行遍历 2.2 对二级分类的DataFrameGroupBy对象进行遍历 3. agg()函数 3.1一般写法_对目标数据使用同一聚合函数 3.2 对不同列使用不同聚合函数 3.3 自定义函数写法 4. 通过 字典 和 Se

随机推荐