用Map中一个Value将List<Map>进行分组成List<对象>(根据对象的属性去重)或者List<Map>(List<Map>根据Value去重)

文章展示了如何利用Java的Stream流对数据进行处理,包括将数据分组成List对象,以及按照特定值(如pcId或pzId)进行分组和去重的操作。整个过程涉及对原始List的遍历,创建新对象,以及使用TreeSet进行去重。
摘要由CSDN通过智能技术生成

可以用stream流进行处理,下面这个自己写的有用就参考一下

一、分组成List<对象>

先建一个实体类作为分组后的每一个对象

package com.njusc.core.api.dto;

import java.util.List;
import java.util.Map;

/**
 *
 */
public class PingzDc {
    private String pcId;
    private List<Map> list;

    @Override
    public String toString() {
        return "PingzDc{" +
                "pcId='" + pcId + '\'' +
                ", list=" + list +
                '}';
    }

    public String getPcId() {
        return pcId;
    }

    public void setPcId(String pcId) {
        this.pcId = pcId;
    }

    public List<Map> getList() {
        return list;
    }

    public void setList(List<Map> list) {
        this.list = list;
    }
}

然后进行分组(我是根据组织名称进行分组的deptName)

            List<Map> list = initList(pingzList, user);//传过来的数据
            List<Map> mapList = list;//复制一份List<Map>
            List<PingzDc> pingzDcList = new ArrayList<>();//创建一个上面的对象集合
            for (Map map : list) {
                String pcId= (String) map.get("pcId");//获取Value
                PingzDc pingzDc = new PingzDc();//创建对象
                pingzDc.setPcId(pcId);//将Value值赋值进去
                List<Map> list1 = new ArrayList<>();
                for (Map map1 : mapList) {
                   String pcId1= (String) map1.get("pcId");
                   if (pcId.equals(pcId1)){//从复制的List<Map>中将Value取出来进行比较
                        list1.add(map1);
                   }
                }
                pingzDc.setList(list1);
                pingzDcList.add(pingDc);
            }
            //最后根据Value进行一个去重
            Set<PingzDc> set 
            = new TreeSet<>(Comparator.comparing(PingzDc::getPcId));
            set.addAll(pingzDcList);
            pingzDcList =new ArrayList<>(set);

 结果:

[PingzDc {
  pcId = '1', 
  list = [{
      buildFrom = 11,
      zhaiy = 村集体组织zcy001,
      money_j = 22.00,
      onlyKmName = 银行存款,
      jzState = 0,
      pzCx = null,
      money_d = ,
      userName = 张女士,
      pzCxId = null,
      pzDate = 2023 - 01 - 31,
      pzId = 1
 }, {
      buildFrom = 11,
      zhaiy = 村集体组织zcy001,
      money_j = ,
      onlyKmName = 银行存款,
      jzState = 0,
      pzCx = null,
      money_d = 11.00,
      userName = 张女士,
      pzCxId = null,
      pzDate = 2023 - 01 - 31,
      pzId = 1
 }]
}, 
PingzDc {
 pcId = '2', 
 list = [{
      buildFrom = 11,
      zhaiy = 收入zcy001,
      money_j = 100.00,
      onlyKmName = 现金,
      jzState = 0,
      pzCx = null,
      money_d = ,
      userName = 张女士,
      pzCxId = null,
      pzDate = 2023 - 01 - 31,
      pzId = 2
 }, {
      buildFrom = 11,
      zhaiy = 收入zcy001,
      money_j = ,
      onlyKmName = 现金,
      jzState = 0,
      pzCx = null,
      money_d = 100.00,
      userName = 张女士,
      pzCxId = null,
      pzDate = 2023 - 01 - 31,
      pzId = 2
 }]
}, 
PingzDc {
 pcId = '3', 
 list = [{
      buildFrom = 11,
      zhaiy = 支出倒叙,
      money_j = 100.00,
      onlyKmName = 银行存款,
      jzState = 0,
      pzCx = null,
      money_d = ,
      use
......

二、分组成List<map>

                List<Map> list1 = initList(pingzList, user);//这个是你的List
                List<Map> mapList1 = list1;
                List<Map> pingzDcList = new ArrayList<>();
                for (Map map : list1) {
                    String pzId = (String) map.get("pzId");
                    Map map3 = new HashMap();
                    map3.put("pzId",pzId);
                    List<Map> list2 = new ArrayList<>();
                    for (Map map1 : mapList1) {
                        String pzId1 = (String) map1.get("pzId");
                        if (pzId.equals(pzId1)){
                            list2.add(map1);
                        }
                    }
                    map3.put("list",list2);
                    pingzDcList.add(map3);
                }
                //去重此时List是你要的List<Map>(List<Map>根据Map中的Value去重)
                List<Map> list = pingzDcList.stream().collect(
                        Collectors.collectingAndThen(
                                Collectors.toCollection(
                     () ->new TreeSet<>(Comparator.comparing(m- >m.get("pzId").toString()))
                                ),ArrayList::new
                        )
                );

结果:

[{
	"pzId": "1",
	"list": [{
		"buildFrom": 11,
		"zhaiy": "村集体组织zcy001",
		"money_j": "22.00",
		"onlyKmName": "银行存款",
		"jzState": 0,
		"money_d": "",
		"userName": "张女士",
		"pzDate": "2023-01-31",
		"pzId": "1"
	}, {
		"buildFrom": 11,
		"zhaiy": "村集体组织zcy001",
		"money_j": "",
		"onlyKmName": "银行存款",
		"jzState": 0,
		"money_d": "11.00",
		"userName": "张女士",
		"pzDate": "2023-01-31",
		"pzId": "1"
	}]
}, {
	"pzId": "2",
	"list": [{
		"buildFrom": 11,
		"zhaiy": "收入zcy001",
		"money_j": "100.00",
		"onlyKmName": "现金",
		"jzState": 0,
		"money_d": "",
		"userName": "张女士",
		"pzDate": "2023-01-31",
		"pzId": "2"
	}, {
		"buildFrom": 11,
		"zhaiy": "收入zcy001",
		"money_j": "",
		"onlyKmName": "现金",
		"jzState": 0,
		"money_d": "100.00",
		"userName": "张女士",
		"pzDate": "2023-01-31",
		"pzId": "2"
	}]
}, {
	"pzId": "3",
	"list": [{
		"buildFrom": 11,
		"zhaiy": "支出倒叙",
		"money_j": "100.00",
		"onlyKmName": "银行存款",
		"jzState": 0,
		"money_d": "",
		"userName": "张女士",
		"pzDate": "2023-01-31",
		"pzId": "3"
        .......

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要对 Map<String, Map<String, List<TodayTradeInfoDto>>> 对象进行排序,需要明确一下排序的依据,比如按照 TodayTradeInfoDto 的某个属性排序。下面以 TodayTradeInfoDto 的 tradeTime 属性为例,给出一个排序的示例代码: ```java public static Map<String, Map<String, List<TodayTradeInfoDto>>> sortMapByTradeTime(Map<String, Map<String, List<TodayTradeInfoDto>>> tradeInfoMap) { // 用于存放排序结果的 TreeMap TreeMap<String, Map<String, List<TodayTradeInfoDto>>> sortedMap = new TreeMap<>(); // 遍历原始的 tradeInfoMap,将每个 key-value 键值对存入到 sortedMap for (Map.Entry<String, Map<String, List<TodayTradeInfoDto>>> entry1 : tradeInfoMap.entrySet()) { String key1 = entry1.getKey(); Map<String, List<TodayTradeInfoDto>> value1 = entry1.getValue(); TreeMap<String, List<TodayTradeInfoDto>> sortedValue1 = new TreeMap<>(); for (Map.Entry<String, List<TodayTradeInfoDto>> entry2 : value1.entrySet()) { String key2 = entry2.getKey(); List<TodayTradeInfoDto> value2 = entry2.getValue(); List<TodayTradeInfoDto> sortedValue2 = value2.stream() .sorted(Comparator.comparing(TodayTradeInfoDto::getTradeTime)) .collect(Collectors.toList()); sortedValue1.put(key2, sortedValue2); } sortedMap.put(key1, sortedValue1); } // 返回排序结果 return sortedMap; } ``` 这里用到了 Java 的 TreeMap,它会按照 key 的自然顺序进行排序。对于内层的 Map,我们也需要将它转换成 TreeMap,并指定排序的方式。这里用到了 Java 8 的流式编程,对 List 的元素按照 tradeTime 属性排序。最后将排序结果存入到 sortedMap 并返回即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值