利用Set 对List<Map<String,Obj

作者: 南京杨小兵 | 来源:发表于2018-08-30 10:45 被阅读4次
    public static void main(String[] args) {
    
    //需求:根据List<Map<String,Object>> 的map中name 属性相同去重
    /////////////////////////////////////////////以下为造数据/////////////////////////////////////////////////////////////////////////////////////////
              //创建数据,对根据姓名 name 去重
              List<Map<String,Object>>  allList = new ArrayList<>();
              List<Map<String,Object>>  smallList = new ArrayList<>();
    
              Map<String,Object> map1 = new HashMap<>();
    
              map1.put("id",2019);
              map1.put("name","小明");
              map1.put("id",2017);
              map1.put("name","小王");
    
    
              Map<String,Object> map2 = new HashMap<>();
              map2.put("id",2020);
              map2.put("name","小明");
    
              allList.add(map1);
              allList.add(map2);
              smallList.add(map2);
    
    /////////////////////////////////////////////以上为造数据/////////////////////////////////////////////////////////////////////////////////////////
    
              /*将list map 转list pojo,必须要转成对象,因为要去重某一个属性值,而不是去重整个对象,所以必须重写 这个属性值的hashcode 和equals 值*/ 
              List<U> list1 = jsonToList(JSONArray.fromObject(allList).toString(),U.class);
              List<U> list2 = jsonToList(JSONArray.fromObject(smallList).toString(),U.class);
    
              Set<U> set = new HashSet<>();
              set.addAll(list1);
              set.addAll(list2);
    
              for (U u :set){
                   System.out.println(u.getName());
              }
         }
    

    运行结果:


    image.png
    public static   class  U {
              private  Integer id;
              private  String name;
    
              public Integer getId() {
                   return id;
              }
    
              public void setId(Integer id) {
                   this.id = id;
              }
    
              public String getName() {
                   return name;
              }
    
              public void setName(String name) {
                   this.name = name;
              }
    
              /**必须重写hashcode 和 equals 方法 */
              @Override
              public int hashCode() {
    
                   return name.hashCode(); // 重写此属性值的hashcode,不然就是判断这个对象的hashcode
              }
    
    
              @Override
              public boolean equals(Object obj) {
    
                   if (obj instanceof  U){
                        U o = (U)obj;
                        if (o.getName().equals(name)){ //根据属性值进行判断
                             return true;
                        }
                   }
    
                   return super.equals(obj);
              }
         }
    
       /**
         * 将json数据转换成pojo对象list
         */
        public static <T>List<T> jsonToList(String jsonData, Class<T> beanType) {
            JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
            try {
                List<T> list = MAPPER.readValue(jsonData, javaType);
                return list;
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return null;
        }
    
             Set<U> set1 = new HashSet<>();
             Set<U> set2 = new HashSet<>();
    
              set1.addAll(list1);//小王、小明
              set2.addAll(list2);//小明、小哥
              set2.retainAll(set1); //求交集
              set1.addAll(set2); //求并集
              set1.removeAll(set2); //求差集
    

    相关文章

      网友评论

        本文标题:利用Set 对List<Map<String,Obj

        本文链接:https://www.haomeiwen.com/subject/ntrrwftx.html