集合分组

一,List分组

// 1.java8之前
// 按照Name分组,准备Map,此处使用LinkedHashMap的原因是为了保证后续遍历的时候,按照分组时的add顺序来操作
Map<String,List<Vo>> groupMap = new LinkedHashMap<String,List<Vo>>();
for(Vo groupVo : dataList) {
    String groupName = groupVo.getGroupName();
    //如果Map中的key包含此时的groupName,则取出Value,直接add此实体
    if(groupLimitNeedVO.containsKey(groupName)) {
        groupLimitNeedVO.get(groupName).add(groupVo);
        //否则的话,新建一个key为groupName的List,并将groupName作为key,list作为value放入map
    }else {
        List<Vo> groupList = new LinkedList<Vo>();
        groupList.add(groupVo);
        groupLimitNeedVO.put(groupName, groupList);
    }
}
// 遍历
Set<String> keySet = groupMap.keySet();
    for(String groupName : keySet) {
        System.out.printf("groupName"+)groupName;
    }

// 2.java8的流分组
// 单条件
Map<String, List<Vo>> groupMap = dataList.stream()
    .collect(Collectors.groupingBy(Vo::getGroupName));
     //.collect(Collectors.groupingBy( (Vo v) -> v.getGroupName() ))

// 多级
Map<String, Map<String, List<Vo>>>  groupMap = dataList.stream().collect(
Collectors.groupingBy(Vo::getGroupName1),Collectors.groupingBy(Vo::getGroupName2));

二,JSON分组

// 1.单条件
var map = {};
var dest = [];
for(var i = 0; i < datas.length; i++){
   var ai = datas[i];
   if(!map[ai.currency]){// 自定义分组
      dest.push({
         title: ai.currency,// 自定义分组
         name: i,
         content: [ai]
      });
      map[ai.currency] = ai; // 自定义分组
   }else{
      for(var j = 0; j < dest.length; j++){
         var data = dest[j];
         if(data.title == ai.currency){// 自定义分组
            data.content.push(ai);
            break;
         }
      }
   }
}

// 2.多条件 方法内传分组对象的数组,即可实现多次分组
function createTree(arr,keys) {
  function createObj(arr, arrORobj, keys, start) {
    for (let i = 0; i < arr.length; i++) {
      // 当不存在一个排序的key,返回[]
      if (start >= keys.length) {
        let newArray=Array.isArray(arrORobj)?arrORobj:[]
        return newArray.concat(arr[i])
      }
      let curKey = keys[start]
      let curVal = arr[i][curKey]
      if(!curVal)continue
      // 存在key对应的值存在,传入{}构造
      let newObj = arrORobj[curVal] ? arrORobj[curVal] : {}
      arrORobj[curVal] = createObj([arr[i]], newObj, keys, start + 1)
    }
    // 存在一个排序的key,返回{}
    return arrORobj
  }
  return createObj(arr,{},keys,0)
};
var obj1=[
    {
        "demp":"001",
        "line":"a",
        "id":"1",
    },
    {
        "demp":"001",
        "line":"b",
        "id":"2",
    },
    {
        "demp":"001",
        "line":"c",
        "id":"3",
    },
    {
        "demp":"002",
        "line":"a",
        "id":"4",
    },
    {
        "demp":"002",
        "line":"b",
        "id":"5",
    },
    {
        "demp":"002",
        "line":"b",
        "id":"6",
    }
];
createTree(obj1,['demp','line']);

参考:
https://cloud.tencent.com/developer/article/1446684
https://www.cnblogs.com/zhengyb/p/10106564.html

原文地址:https://www.cnblogs.com/rainbowk/p/11696601.html

时间: 2024-08-28 06:50:13

集合分组的相关文章

List集合分组实现教程

封装一个方法,用一个Map来实现,这里是根据bean类的seq字段进行拆分的,分成好几个list private LinkedHashMap<String,List<HandleInfo>> groupListBySeq(List<HandleInfo> list) { LinkedHashMap<String,List<HandleInfo>> map = new LinkedHashMap<String,List<HandleIn

List集合分组

1 var ArticleList = new Services.Data.SearchService().GetArticleBaseList(ref param); 2 IEnumerable<IGrouping<string, Models.Data.ArticleBase>> Collection = ArticleList.GroupBy(p => p.YearIssue).ToList();//DBYL 3 foreach (IGrouping<string

一道关于集合分组并进行笛卡尔积的题目思路

list<string> arrs=new list<string>(){"1_2","1_3","2_3","2_4","3_9","3_11","4_1","4_12"};dictionary<string,list<string> dics=new dictionary<string,list&

Java8自定义条件让集合分组

/** * 将一个指定类型对象的集合按照自定义的一个操作分组: 每组对应一个List.最终返回结果类型是:List<List<T>> * * @param <T> */ static class GroupToList<T> implements Collector<T, List<List<T>>, List<List<T>>> { /** * 集合中对象两两比较,满足自定义的条件(operati

underscore.js源码解析【集合部分】

// Collection Functions // -------------------- // The cornerstone, an `each` implementation, aka `forEach`. // Handles raw objects in addition to array-likes. Treats all // sparse array-likes as if they were dense. /* params: 数组.对象或类数组对象,函数,函数执行环境 *

ArrayList实现分组功能

这边只用2个属性来进行分组 定义Object有key与value属性 按照key的不同对于arrayList进行分组 List<Object> tempList=new ArrayList<>(); tempList=service.queryObjectLidtByObject(object); Map<String,String> map=new HashMap<String,String>(); //将集合分组 for(int k=tempList.s

Underscore.js (1.7.0)-集合(Collections)(25)

稽核函数(数组或对象) each_.each(list, iteratee, [context]) 别名: forEach 遍历list中的所有元素,按顺序用遍历输出每个元素.如果传递了context参数,则把iteratee绑定到context对象上.每次调用iteratee都会传递三个参数:(element, index, list).如果list是个JavaScript对象,iteratee的参数是 (value, key, list)).返回list以方便链式调用.(注:如果存在原生的f

java8 list数据过滤,分组

传统方式:ListUtil.java public class ListUtil{ private static Logger LOGGER=LoggerFactory.getLogger(ListUtil.class); /** * 分组依据接口,用于集合分组时,获取分组 * T为要groupBy属性是类型,这个返回值为要groupBy的属性值 */ public interface GroupBy<T> { T groupBy(Object obj) ; } /** * 通过属性对集合分组

underscore中文api (1.8.2)

Underscore一个JavaScript实用库,提供了一整套函数式编程的实用功能,但是没有扩展任何JavaScript内置对象.它是这个问题的答案:“如果我在一个空白的HTML页面前坐下, 并希望立即开始工作, 我需要什么?“...它弥补了部分jQuery没有实现的功能,同时又是Backbone.js必不可少的部分. (感谢@小邓子daj的翻译建议) Underscore提供了100多个函数,包括常用的: map, filter, invoke — 当然还有更多专业的辅助函数,如:函数绑定,