Java List分组,去重,求个数

以“求各个港口的 船、航次的 个数 ”为例,最终实现的结果集如下:

代码实现,如下:

        if(!rsList3.isEmpty() && rsList3.size()>0) {
        	int total_vessel_num = 0;//总计 船条数
        	int total_voyage_num = 0;//总计 航次数

     	    List<IRow> resultList3 = new ArrayList<IRow>();//最终结果集
     	    //按港口分组
        	String PORT_CD_KEY = "PORT_CD";
     		LinkedHashSet<String> setTmp =new LinkedHashSet<String>();
     		for (IRow irow : rsList3) {
     			setTmp.add(irow.getValue(PORT_CD_KEY));//按原list的顺序 去重
     		}
     		for (String temp : setTmp) {
     			int portNum = 0;//港口的个数
     			String PORT_CD_VAL = "";
     		    Map<String, String> repeatMap = new HashMap<String, String>();
     			//按港口分组的单个港口的List
     		    List<IRow> portList = new ArrayList<IRow>();

     		    for (int i = 0; i < rsList3.size(); i++) {
	 		    	IRow irow = rsList3.get(i);
	 		    	PORT_CD_VAL = irow.getValue(PORT_CD_KEY);
	 	            if (temp.equals(PORT_CD_VAL)) {
	 	            	if(!repeatMap.containsValue(PORT_CD_VAL)) {
	 	            		portNum += 1;
	 	            	 }
	 	            	 repeatMap.put(PORT_CD_KEY, PORT_CD_VAL);
	 	            	 portList.add(irow);
	 	            }
     		    }
     		    
     		    String vessel_cd_key ="VESSEL_CD";
     		    Set<Object> vessel_cd_val = new HashSet<Object>();

     		    String voyage_key ="VOYAGE";
     		    Set<Object> voyage_val = new HashSet<Object>();

	   	    	for (IRow tmp : portList) {
	   	    		//把单个港口的list 再按 船、航次分组,去重
	   	    		vessel_cd_val.add(tmp.getValue(vessel_cd_key));
	   	    		voyage_val.add(tmp.getValue(voyage_key));
	   	        }
	   	    	//船小计
	   	    	int vesselNum = vessel_cd_val.size();
	   	    	total_vessel_num += vesselNum;
	   	    	//航次小计
	   	    	int voyageNum = voyage_val.size();
	   	    	total_voyage_num += voyageNum;

				IRow xjRow = new Row();
				xjRow.setValue("PORT_CD", temp+"小计");
	   	        xjRow.setValue("VESSEL_CD", String.valueOf(vesselNum));
     	        xjRow.setValue("VOYAGE", String.valueOf(voyageNum));
     	        portList.add(xjRow);
     	         
     	        for (IRow iRow : portList) {
     	        	resultList3.add(iRow);
     	        }
     	    }
			IRow totalRow = new Row();
			totalRow.setValue("PORT_CD", "总计");
			totalRow.setValue("VESSEL_CD", String.valueOf(total_vessel_num));
			totalRow.setValue("VOYAGE", String.valueOf(total_voyage_num));
			
			resultList3.add(totalRow);
			System.out.println(resultList3);
        }

备注:

1.Set集合:

插入无序,不可指定位置访问,数据不可重复。

迭代器:

        Iterator iterator = set.iterator();
        while(iterator.hasNext()) {
            System.out.println(iterator.next());
        }

2.LinkedHashSet

是Set集合的一个实现,具有set集合不重复的特点,同时具有可预测的迭代顺序,也就是我们插入的顺序。

是一个非线程安全的集合。如果有多个线程同时访问当前linkedhashset集合容器,并且有一个线程对当前容器中的元素做了修改,那么必须要在外部实现同步保证数据的冥等性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值