精华内容
下载资源
问答
  • List按照某个属性进行分组的算法

    一、分析

    实际应用场景,list中的元素的某个属性是重复的,因此可以按照此元素对list进行分组,最终放到Map集合,此元素为key值,分组后的list为value值

    二、实现代码

    2.1普通方法

        public static Map<String,List<User>> splitGroup(List<User> list){
            //初始化一个map
            Map<String,List<User>> map = new HashMap<>();
            for(User user : list){
                String key = user.getId();
                if(map.containsKey(key)){
                    //如果map中存在以此id作为的key,将数据元素存放当前key的list集合中
                    map.get(key).add(user);
                }else{
                    //map中不存在以此id作为的key,新建key用来存放数据
                    List<User> userList = new ArrayList<>();
                    userList.add(user);
                    map.put(key,userList);
                }
            }
            return map;
        }
    

    2.2Stream流

    一行代码搞定

    Map<String,List<User>> stringListMap = list.stream().collect(Collectors.groupingBy(User::getId));
    

    三、测试代码及测试结果

        public static void main(String[] args) {
            List<User> list = new ArrayList<>();
            //当前测试以id来分组,User实体类中成员变量有id及name,全参构造方法,toString方法
            list.add(new User("1", "1"));
            list.add(new User("1", "2"));
            list.add(new User("2", "2"));
            list.add(new User("2", "3"));
            list.add(new User("2", "4"));
            list.add(new User("3", "3"));
            
            //测试普通方法
            //Map<String, List<User>> stringListMap = splitGroup(list);
            
            //测试stream流
            Map<String,List<User>> stringListMap = list.stream().collect(Collectors.groupingBy(User::getId));        
    
            //将map集合转为set集合遍历
            Set<Map.Entry<String, List<User>>> entries = stringListMap.entrySet();
            for(Map.Entry m : entries){
                System.out.println(m);
            }
        }
    

    测试的结果如下
    在这里插入图片描述
    参考博客

    展开全文
  • 最近一直在写一个java的业务系统,后台对数据库的操作工作量巨大,这个是我在写代码时遇到的,总结出来的方法,希望能帮助到需要的人,什么也不多说了,直接上源码吧! 从数据库中取数据,根据MyBits返回结果主要有...

    最近一直在写一个java的业务系统,后台对数据库的操作工作量巨大,这个是我在写代码时遇到的,总结出来的方法,希望能帮助到需要的人,什么也不多说了,直接上源码吧!

    从数据库中取数据,根据MyBits返回结果主要有两种类型的List,一种是List<Entity>,还一种是List<Map<String,Object>>

    以下是对List<Entity>的归类

        /**
         * 将对象列表按名称分类成Map(分类名必与对象的某 get方法的后的名一致<如:getName则传入“Name">
         * @param list
         * @param name
         * @return
         */
        public static <T> Map<String,List<T>> objListToMapClassificationByName(List<T> list,String name){
            Map<String,List<T>> resultMap = Maps.newHashMap();
    
            for (T obj : list) {
                try {
                    Method method = obj.getClass().getMethod("get" + name);
                    String keyName = (String) method.invoke(obj);
                    if(StringUtils.isBlank(keyName))
                        continue;
                    List<T> tempList = null;
                    if (!resultMap.containsKey(keyName)) {
                        tempList = new ArrayList<>();
                    } else {
                        tempList = resultMap.get(keyName);
                    }
                    tempList.add(obj);
                    resultMap.put(keyName, tempList);
                }
                catch (Exception e) {
    
                }
            }
            return resultMap;
        }
    
        /**
         * 将对象列表按名称建立索引,分类名必与对象的某 get方法的后的名一致<如:getName则传入“Name">
         * @param list
         * @param name
         * @return
         */
        public static <V,T> HashMap<V, T> getObjListToMapForOnlyByName(List<T> list, String name) /*throws Exception*/{
            HashMap<V, T> mapResult=Maps.newHashMap();
            if(list != null && list.size() >0){
                for(T obj : list) {
                    try{
                        Method method = obj.getClass().getMethod("get" + name);
                        mapResult.put((V)method.invoke(obj), obj);
                    }
                    catch (Exception e){
                        break;
                    }
                }
            }
            return mapResult;
        }
    

    以下是对List<Map<String,Object>>的归类

        /**
    	 * 获取按字段索引的列表(可重复)
    	 * @param list
    	 * @param name
    	 * @return HashMap<String,List<Map<String, Object>>>
    	 */
    	public static HashMap<String,List<Map<String, Object>>> getListClassifiedMapByName(List<Map<String, Object>> list,String name){
    		HashMap<String,List<Map<String, Object>>> mapResult=Maps.newHashMap();
    		if(list != null && list.size() >0) {
                for (Map<String, Object> map : list) {
                    String keyName = (String) map.get(name);
                    if(StringUtils.isBlank(keyName))
                        continue;
                    List<Map<String, Object>> tempList = null;
                    if (!mapResult.containsKey(keyName)) {
                        tempList = new ArrayList<>();
                    } else {
                        tempList = mapResult.get(keyName);
                    }
                    tempList.add(map);
                    mapResult.put(keyName, tempList);
                }
            }
    		return mapResult;
    	}
    
        /**
         * 将列表按照某个key分类,可重复(内容拷贝,不影响原list)
         * @param list
         * @param name
         * @return HashMap<String,List<Map<String, Object>>>
         */
        public static HashMap<String,List<Map<String, Object>>> getNewListClassifiedMapByName(List<Map<String, Object>> list,String name){
    		
        	HashMap<String,List<Map<String, Object>>> mapResult=Maps.newHashMap();
    		for (Map<String, Object> map : list) {
    			String keyName=(String) map.get(name);
    			Map<String, Object> valueMap = Maps.newHashMap();
    			valueMap.putAll(map);
    			
    			List<Map<String, Object>> tempList = null;
    			if(!mapResult.containsKey(keyName)) {
    				tempList = new ArrayList<>();
    			}
    			else {
    				tempList = mapResult.get(keyName);
    			}
    			tempList.add(valueMap);
    			mapResult.put(keyName, tempList);	
    		}
    		return mapResult;
    	}
        
        /**
         * 将列表按照某个key分类,唯一内容(内容拷贝,不影响原list)
         * @param list
         * @param name
         * @return HashMap<String,Map<String, Object>>
         */
        public static HashMap<String,Map<String, Object>> getNewListClassifiedMapForOnlyByName(List<Map<String, Object>> list,String name){
    		HashMap<String,Map<String, Object>> mapResult=Maps.newHashMap();
    		for (Map<String, Object> map : list) {
    			String keyName=(String) map.get(name);
    			if(StringUtils.isBlank(keyName))
    			    continue;
    			Map<String, Object> valueMap = Maps.newHashMap();
    			valueMap.putAll(map);
    			mapResult.put(keyName, valueMap);	
    		}
    		return mapResult;
    	}
        

     

    展开全文
  • java list float属性排序

    千次阅读 2019-12-18 17:13:36
    项目需要对一个类的对象的list按照其中的一个属性进行排序。 这篇博客园的文章是我参考的非常好的一篇,但是很可惜其中的比较的属性必须是整形。 https://www.cnblogs.com/0201zcr/p/5395639.html list排序的两种...

    前言

    项目需要对一个类的对象的list按照其中的一个float属性进行排序。网上有很多关于关于对类的对象的列表的排序,但看到的大都是整型或字符串类型的属性才能排序。

    本文解决了按照float型属性排序的方法,但感觉尚不是最好的解决方案,故此记录,也抛砖引玉,希望有大佬能够有更好的解决办法,还望不吝赐教,不胜感激!

    这篇博客园的文章是我参考的非常好的一篇,但是很可惜其中的比较的属性必须是整形或字符串型。以下是原文链接。如果认为本文引用过多,还请联系本人,尽快修改。向大佬致敬!
    https://www.cnblogs.com/0201zcr/p/5395639.html

    list排序的两种方法

    Java API针对集合类型的排序提供了2个方法:

    java.util.Collections.sort(java.util.List)
    java.util.Collections.sort(java.util.List, java.util.Comparator)
    

    如果集合里面的元素都是相同类型的,并且实现了Comparable接口,那么可以直接调用第一个方法。
    如果你有其它的排序的想法,比如你不想按照自然排序进行,还可以传一个Comparator过去,比如反向。元素不相同的情况比较复杂,可以暂时不用考虑。

    通过实现Comparable接口来实现list的排序

    假如现在我们有一个Particle类的list集合,要让其按照一个Order属性进行排序,我们可以让Particle类实现Comparable接口,重写其CompareTo方法即可。具体实现如下:
    1)Particle实体类

    public class Particle implements Comparable<Particle> {
        private String name;
        private Integer order;
     
        public String getName() {
            return name;
        }
     
        public void setName(String name) {
            this.name = name;
        }
        
        public Integer getOrder() {
            return order;
        }
     
        public void setOrder(Integer order) {
            this.order = order;
        }
    
        @Override
        public int compareTo(Person arg0) {
            return this.getOrder().compareTo(arg0.getOrder());  //这里定义你排序的规则。
        }
     
    }
    

    通过重写Comparable接口的compareTo方法,可以让程序按照我们想要的排列方式进行排序,如上面的代码是让我让Particle按照order属性升序排序。如果想让其按照降序排列,可以将其CompareTo方法重写为:

    @Override
        public int compareTo(Person arg0) {
            return arg0.getOrder().compareTo(this.getOrder());  //这里定义你排序的规则。
        }
    

    2)测试类

    public static void main(String[] args) {
        //初始化数据
        List<Particle> listA = new ArrayList<Particle>();
        Person p1 = new Person();
        Person p2 = new Person();
        Person p3 = new Person();
     
        p1.setName("name1");
        p1.setOrder(1);
        p2.setName("name2");
        p2.setOrder(2);
        p3.setName("name3");
        p3.setOrder(3);
        
        // 注意我的添加顺序呦
        listA.add(p2);
        listA.add(p1);
        listA.add(p3);
    
        //排序
        Collections.sort(listA);
    
        //打印排序后的Person
        for (Particle p : listA) {
            System.out.println(p.getName());
        }
    }
    

    3)结果:

    name1
    name2
    name3
    

    通过重载Collections.sort方法

    直接重载java.util.Collections.sort(java.util.List, java.util.Comparator) 方法。可以灵活的修改我们排序的方式,具体实现如下:
    1)Particle类
    和上面的类相同,但没实现Comparable接口

    public class Particle {
        private String name;
        private Integer order;
     
        public String getName() {
            return name;
        }
     
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getOrder() {
            return order;
        }
    
        public void setOrder(Integer order) {
            this.order = order;
        }
     
    }
    

    2)测试类

    public static void main(String[] args) {
            List<Particle> listA = new ArrayList<Particle>();
            Person p1 = new Person();
            Person p2 = new Person();
            Person p3 = new Person();
     
            p1.setName("name1");
            p1.setOrder(1);
            p2.setName("name2");
            p2.setOrder(2);
            p3.setName("name3");
            p3.setOrder(3);
     
            listA.add(p2);
            listA.add(p1);
            listA.add(p3);
             
            //直接在这里添加我们的排序规则
            Collections.sort(listA, new Comparator<Particle>() {
                public int compare(Particle arg0, Particle arg1) {
                    return arg0.getOrder().compareTo(arg1.getOrder());
                }
            });
             
            for (Particle p : listA) {
                System.out.println(p.getName());
            }
        }
    

    从上面看到,直接在Conllections.sort()方法中重写了一个Comparator接口,可以在不同的地方使用Person集合的不同排序方法。如上面还是按照Person的order属性升序排列,我只要改写该方法,就可以在其他地方按照其他的规则对我的list集合进行排序,但是这样子代码看起来会比前面的那种方式繁琐。

    3)结果

    name1
    name2
    name3
    

    属性为float型无法比较的问题

    我通过上面的第二种方法通过重载Collections.sort方法,由于项目中需要对对象的权重按从大到小排序,而权重又是一个分数,float类型,直接改变测试类中的排序规则时,compareTo不能比较两个浮点数。无奈只能用其它方式期待。以下是我的person类和测试类,重点在测试类中的比较方法。
    1)Particle类

    public class Particle {
        private String name;
        private Integer order;
        private float weight;
     
        public String getName() {
            return name;
        }
     
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getOrder() {
            return order;
        }
    
        public void setOrder(Integer order) {
            this.order = order;
        }
        
    	public float getWeight() {
            return weight;
        }
    
        public void setWeight(float weight) {
            this.weight = weight;
        }
     
    }
    

    2)测试类

    public static void main(String[] args) {
            List<Particle> listA = new ArrayList<Particle>();
            Particle p1 = new Particle();
            Particle p2 = new Particle();
            Particle p3 = new Particle();
    
            p1.setName("name1");
            p1.setOrder(1);
            p1.setWeight((float) 0.0000001);
            p2.setName("name2");
            p2.setOrder(2);
            p2.setWeight((float) 0.0000002);
            p3.setName("name3");
            p3.setOrder(3);
            p3.setWeight((float) 0.0000003);
    
            listA.add(p2);
            listA.add(p1);
            listA.add(p3);
    
            //直接在这里添加我们的排序规则
            Collections.sort(listA, new Comparator<Particle>() {
                public int compare(Particle arg0, Particle arg1) {
                    if (arg0.getWeight()>arg1.getWeight()){
                        Log.d("MainAcitity", "排序结果:-1,"
                                +arg0.getWeight()+">"+arg1.getWeight());
                        return -1;
                    }else if(arg0.getWeight()<arg1.getWeight()){
                        Log.d("MainAcitity", "排序结果:1,"
                                +arg0.getWeight()+"<"+arg1.getWeight());
                        return 1;
                    }else{
                        return 0;
                    }
                }
            });
    
            for (Particle p : listA) {
                System.out.println(p.getName());
                Log.d("MainAcitity", "排序结果:" + p.getName());
    
            }
            
    }
    

    3)结果

    name3
    name2
    name1
    

    写在最后

    如果哪位大佬有更好的方法,还望不吝赐教。

    展开全文
  • 使用场景:项目中有个选择法律依据的地方 列表是多选的 《安全法》第一条 《安全法》第十一条 《安全法》第二十一条 ... List<BeanRespGetLaw.Law> lawList = data.getParcelableArrayListExtra("model")...

    使用场景:项目中有个选择法律依据的地方
    列表是多选的
    《安全法》第一条
    《安全法》第十一条
    《安全法》第二十一条
    选择完毕后,要求显示成
    《安全法》第一条,第十一条,第二十一条

    按照这个格式 修改即可

    					// 数据源
    					List<BeanRespGetLaw.Law> lawList = data.getParcelableArrayListExtra("model");
    					// 分组后的数据源
                        List<BeanRespGetLaw.Law> laws = new ArrayList<>();
                        for (BeanRespGetLaw.Law law : lawList) {
                            boolean state = false;
                            for (BeanRespGetLaw.Law l : laws) {
                                if (l.getLaw().equals(law.getLaw())) {
                                    String lawNumber = l.getLawNumber() + ", ";
                                    lawNumber += law.getLawNumber();
                                    l.setLawNumber(lawNumber);
                                    state = true;
                                }
                            }
                            if (!state) {
                                laws.add(law);
                            }
                        }
                        String message = "";
                        for (int i = 0; i < laws.size(); i++) {
                            System.out.println(laws.get(i).getLaw() + "    " + laws.get(i).getLawNumber());
                            message += i + 1 + ":" + laws.get(i).getLaw() + " " + laws.get(i).getLawNumber() + "  ";
                        }
                        // 赋值
                        etDecision.setText(message);
    
    展开全文
  • Java面试题大全(2020版)

    万次阅读 多人点赞 2019-11-26 11:59:06
    发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~ 本套Java面试题大全,全的不能再全,哈哈~ 一、Java 基础 1. JDK 和 JRE 有什么区别? JDK:Java ...
  • Java实现List中的数据分类

    万次阅读 2018-03-06 16:57:40
    分析:如何才能把List中的考生分类呢?有考生id,有机构id,有机构名称,而且我应该按照机构id进行分类。思考:按照什么进行分类处理?考生所属机构。建立一个CandidateOrg类,类中拥有orgId,orgName,...
  • javaList 根据对象某一个属性分组

    千次阅读 2019-07-04 10:26:39
    开发中经常需要根据对象的同一属性进行分组,现记录下操作 ... import java.util.ArrayList; import java.util.HashMap;...import java.util.List; import java.util.Map; import com.alibaba.fastjson.JSON; im...
  • JavaList《map》把里面map中某个key相同记录的其他key 的 value 合并 JavaList《map》把里面map中某个key相同记录的其他key 的 value 合并
  • 获取到了员工对象的list,每个员工对象有一个部门Id的属性,怎样根据这个部门id实现将这个list进行分组, 使部门id相同的分在一组。 具体实现效果类似于sql 查询中的group by。 注: 博客:...
  • List<HashMap<String, Object>> result = new ArrayList<>(); List<HashMap<String, Object>> list = getList(countVo); list.stream() .collect(Collectors
  • List&amp;amp;lt;T&amp;amp;gt; arr = new ArrayList&amp;amp;lt;T&amp;amp;gt;(); Set&amp;amp;lt;Integer&amp;amp;gt; idlist = new HashSet&amp;amp;lt;Integer&amp;amp;gt;(); ...
  • java类实现了对数据表的分类递归树的实现,为本人倾力之作,后期,会发布js版,敬请期待!
  • java反射获取聚合<List>属性字段

    千次阅读 2018-08-27 23:42:31
    个人分类: java 需要动态的传入一个Class的类型,然后反射到启动的List,根据List里定义的泛型,知道其中List的具体对象的各种属性。  代码   import java.lang.reflect.Field; ...
  • 比如:有个人对象,按照年龄范围进行分组,如何用一条java8 stream实现?
  • 选取数据过多,导致前台页面杂乱,采用首字母分类,优化用户体验,下面是java实现List按字母分类的方法,代码是全的,大家可以复制下来运行看看结果,希望可以帮到大家,有什么不懂的地方,在评论区留言交流! 测试入口类:...
  • 现在有个业务需求,就是根据对象某个属性分组并导出到excel 数据示例 类型 c d A 12 13 A 14 15 B 16 17 B 18 19 类似这种格式 要导出到ecxel 按照AB氛围不同的sheet 基本思路 1.先到数据库查询想要...
  • 在开发过程中可能会遇到,需要将List集合内具有相同属性的对象进行分类的情况,具体代码操作如下: package test; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java....
  • * 按照List<Map<String,Object>>里面map的某个value重新封装成多个不同的list, 原始数据类型List<Map * <String,Object>>, 转换后数据类型Map<String,List<Map<String,Object>&...
  • java算法实践,同时也是一个有用的工具类。 例如:一个学生信息的list,学生的信息由班级、性别、学号等,将list按照班级、性别分类。 只需:  Map map = CollectionTools.classifyList(studentAllList,  ...
  • java集合list中的数据按照多个属性分组
  • 近期需要这样的需求,需要对一组数据,按照两个属性来进行唯一分类,但是找了很久没合适的,最终记录下面两种方法来完成需求 List<Student2> lists = new ArrayList<Student2>(); lists.add(new ...
  • List集合某个属性或者字段进行分组 Map<String, List<IndexInfoImport>> collect = listExcel.stream().collect(Collectors.groupingBy(IndexInfoImport::getGroupName)); 转载:...
  • java List集合按照条件分组

    千次阅读 2020-11-23 15:19:43
    如何对List集合中的元素按照某个特性进行分组,接下来我介绍两种方法 首先我们创建一个Student类 @Data //这个是lombok的注解,可省略get、set方法、toString方法这些 public class Student { private String name;...
  • 示例对象: private Integer id ; ...List ...List里面的对象元素,以某个属性来分组,例如,以id分组,将id相同的放在一起: ...java8 lamda表达式实现快速List转map,List进行分组,List按条件过滤
  • javalist根据两个属性进行分组

    万次阅读 2017-09-23 13:35:22
    Map, Map, List<SubsZinger>>> collect = subsZingerList.stream().collect(Collectors. groupingBy (SubsZinger::getPrintInId, Collectors. groupingBy (SubsZinger::getUid))); collect.forEach((key,value)-...
  • java爬虫

    千次阅读 多人点赞 2019-04-12 11:59:12
    ​ 爬虫的分类 ​ 通用的爬虫 ​ 垂直的爬虫 ​ 爬虫的基本原理 爬虫的三大模块: ​ 获取数据 ​ 解析数据 ​ 保存数据 案例一: 爬取起点中文网的小说案例 案例二: 使用爬虫程序登录某个网站, 获取此用户下的信息 ...
  • 集合中为对象,根据对象中的某一属性值分组   例子 1、实体类:构造方法、get/set方法、toString方法省略 public class User { private String id; private String name; private String age; .........
  • 有一个List,每一个元素是一个对象,根据每个对象的两个属性 是否相同划分为同一类,即两个属性都相同时才划为同一类。 并将同类中的num属性进行累加。 如图: 根据material_number和supplier_batch两个字段相同...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 62,559
精华内容 25,023
关键字:

java的list按属性分类

java 订阅