1. 程式人生 > 程式設計 >java8 集合 多欄位 分組 統計個數程式碼

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,23);
    User u3=new User(3,"bb",23);
    User u4=new User(4,"cc",23);
    User u5=new User(5,23);
    User u6=new User(6,23);
    User u7=new User(7,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,Long>> map=new HashMap<String,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,c=0]
User [id=7,age=24,c=1]
User [id=3,userName=bb,c=1]
User [id=4,userName=cc,c=3]
User [id=5,c=0]
User [id=6,c=0]

此處是為了實現如下效果:

java8 集合 多欄位 分組 統計個數程式碼

補充知識: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 集合 多欄位 分組 統計個數程式碼

以上這篇java8 集合 多欄位 分組 統計個數程式碼就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。