东莞大朗网站建设/qq排名优化网站
接到任务 进行一个菜单去重排序的功能 还是比较有意思的
背景:一个用户 存在 多个角色 一个角色分别有对应的菜单 所以要进行合并 去重 排序处理 并且菜单拥有二级甚至三级菜单
先定义一个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;}@Overridepublic 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;}@Overridepublic 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>() {@Overridepublic 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();} }