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();
}
}
还没有评论,来说两句吧...