List<list>进行去重 排序

接到任务 进行一个菜单去重排序的功能 还是比较有意思的

背景:一个用户 存在 多个角色  一个角色分别有对应的菜单  所以要进行合并 去重 排序处理 并且菜单拥有二级甚至三级菜单

先定义一个Menu类  并且重写它的hashcode和equals

package com.sitech.smartcity.common.entity;

import java.util.List;

public class Menu {
   private String menuName;
   private String url;
   private List<Menu> menus;
   private String openType;//0:iframe嵌套  1: load加载 ;2 :window.location打开新界面
   private String logourl;
   private String code;//app业务编码
   private String classCode;//分类编码
   private String appid;
   private Integer classPriority;//排序字段

   public Integer getClassPriority() {
      return classPriority;
   }

   public void setClassPriority(Integer classPriority) {
      this.classPriority = classPriority;
   }

   public String getMenuName() {
      return menuName;
   }

   public void setMenuName(String menuName) {
      this.menuName = menuName;
   }

   public String getUrl() {
      return url;
   }

   public void setUrl(String url) {
      this.url = url;
   }

   public List<Menu> getMenus() {
      return menus;
   }

   public void setMenus(List<Menu> menus) {
      this.menus = menus;
   }

   public String getOpenType() {
      return openType;
   }

   public void setOpenType(String openType) {
      this.openType = openType;
   }

   public String getLogourl() {
      return logourl;
   }

   public void setLogourl(String logourl) {
      this.logourl = logourl;
   }

   public String getCode() {
      return code;
   }

   public void setCode(String code) {
      this.code = code;
   }

   public String getClassCode() {
      return classCode;
   }

   public void setClassCode(String classCode) {
      this.classCode = classCode;
   }

   public String getAppid() {
      return appid;
   }

   public void setAppid(String appid) {
      this.appid = appid;
   }

   @Override
   public boolean equals(Object o) {
      if (this == o) return true;
      if (o == null || getClass() != o.getClass()) return false;
      Menu menu = (Menu) o;
      if (menuName != null ? !menuName.equals(menu.menuName) : menu.menuName != null) return false;
      if (url != null ? !url.equals(menu.url) : menu.url != null) return false;
      if (openType != null ? !openType.equals(menu.openType) : menu.openType != null) return false;
      if (code != null ? !code.equals(menu.code) : menu.code != null) return false;
      if (classCode != null ? !classCode.equals(menu.classCode) : menu.classCode != null) return false;
      if (appid != null ? !appid.equals(menu.appid) : menu.appid != null) return false;
      return classPriority != null ? classPriority.equals(menu.classPriority) : menu.classPriority == null;
   }

   @Override
   public int hashCode() {
      int result = menuName != null ? menuName.hashCode() : 0;
      result = 31 * result + (url != null ? url.hashCode() : 0);
      result = 31 * result + (menus != null ? menus.hashCode() : 0);
      result = 31 * result + (openType != null ? openType.hashCode() : 0);
      result = 31 * result + (logourl != null ? logourl.hashCode() : 0);
      result = 31 * result + (code != null ? code.hashCode() : 0);
      result = 31 * result + (classCode != null ? classCode.hashCode() : 0);
      result = 31 * result + (appid != null ? appid.hashCode() : 0);
      result = 31 * result + (classPriority != null ? classPriority.hashCode() : 0);
      return result;
   }
}

然后 写几个 方法 用来合并 去重 排序的方法

//清除重复数据 利用set集合的 无重复特点 
public static List removeDuplicate(List list) {
   HashSet h = new HashSet(list);
   list.clear();
   list.addAll(h);
   return list;
}

//根据排序字段进行排序
public static List compareList(List<Menu> list){
   Collections.sort(list, new Comparator<Menu>() {
      @Override
      public int compare(Menu m1,Menu m2) {
         if (m1.getClassPriority() > m2.getClassPriority()) {
            return 1;
         }
         if (m1.getClassPriority() == m2.getClassPriority()) {
            return 0;
         }
         return -1;
      }
   });
   return list;
}


//递归  合并  去重
public static void trecursive(List<Menu> list){
   try {
      for(Iterator<Menu> oneIter = list.iterator(); oneIter.hasNext();){
         Menu one = oneIter.next();

         for(Iterator<Menu> twoIter = list.iterator(); twoIter.hasNext();){
            Menu two = twoIter.next();
            //classcode为菜单的唯一标识  此处使用刚才重写的equals比较两个Menu对象也可
            if(one.getClassCode()!=null&&one.getClassCode().equals(two.getClassCode())){
               //如果进入 说明存在两个相同菜单  子菜单为空的情况  填充菜单  再去重
               if (one.getMenus() == null && two.getMenus() != null) {
                  one.setMenus(two.getMenus());
               }
               if (two.getMenus() == null && one.getMenus() != null) {
                  two.setMenus(one.getMenus());
               }
               if (two.getMenus() == null && one.getMenus() == null) {
                  continue;
               }
               //否则合并  去重被合并菜单
               one.getMenus().addAll(two.getMenus());
               two.setMenus(one.getMenus());
               removeDuplicate(one.getMenus());
               compareList(one.getMenus());
               //递归
               trecursive(one.getMenus());
            }
         }
      }
   }catch (Exception e){
      e.printStackTrace();
   }
}

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值