List<list>进行去重 排序

客官°小女子只卖身不卖艺 2024-04-17 06:24 142阅读 0赞

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

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

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

  1. package com.sitech.smartcity.common.entity;
  2. import java.util.List;
  3. public class Menu {
  4. private String menuName;
  5. private String url;
  6. private List<Menu> menus;
  7. private String openType;//0:iframe嵌套 1: load加载 ;2 :window.location打开新界面
  8. private String logourl;
  9. private String code;//app业务编码
  10. private String classCode;//分类编码
  11. private String appid;
  12. private Integer classPriority;//排序字段
  13. public Integer getClassPriority() {
  14. return classPriority;
  15. }
  16. public void setClassPriority(Integer classPriority) {
  17. this.classPriority = classPriority;
  18. }
  19. public String getMenuName() {
  20. return menuName;
  21. }
  22. public void setMenuName(String menuName) {
  23. this.menuName = menuName;
  24. }
  25. public String getUrl() {
  26. return url;
  27. }
  28. public void setUrl(String url) {
  29. this.url = url;
  30. }
  31. public List<Menu> getMenus() {
  32. return menus;
  33. }
  34. public void setMenus(List<Menu> menus) {
  35. this.menus = menus;
  36. }
  37. public String getOpenType() {
  38. return openType;
  39. }
  40. public void setOpenType(String openType) {
  41. this.openType = openType;
  42. }
  43. public String getLogourl() {
  44. return logourl;
  45. }
  46. public void setLogourl(String logourl) {
  47. this.logourl = logourl;
  48. }
  49. public String getCode() {
  50. return code;
  51. }
  52. public void setCode(String code) {
  53. this.code = code;
  54. }
  55. public String getClassCode() {
  56. return classCode;
  57. }
  58. public void setClassCode(String classCode) {
  59. this.classCode = classCode;
  60. }
  61. public String getAppid() {
  62. return appid;
  63. }
  64. public void setAppid(String appid) {
  65. this.appid = appid;
  66. }
  67. @Override
  68. public boolean equals(Object o) {
  69. if (this == o) return true;
  70. if (o == null || getClass() != o.getClass()) return false;
  71. Menu menu = (Menu) o;
  72. if (menuName != null ? !menuName.equals(menu.menuName) : menu.menuName != null) return false;
  73. if (url != null ? !url.equals(menu.url) : menu.url != null) return false;
  74. if (openType != null ? !openType.equals(menu.openType) : menu.openType != null) return false;
  75. if (code != null ? !code.equals(menu.code) : menu.code != null) return false;
  76. if (classCode != null ? !classCode.equals(menu.classCode) : menu.classCode != null) return false;
  77. if (appid != null ? !appid.equals(menu.appid) : menu.appid != null) return false;
  78. return classPriority != null ? classPriority.equals(menu.classPriority) : menu.classPriority == null;
  79. }
  80. @Override
  81. public int hashCode() {
  82. int result = menuName != null ? menuName.hashCode() : 0;
  83. result = 31 * result + (url != null ? url.hashCode() : 0);
  84. result = 31 * result + (menus != null ? menus.hashCode() : 0);
  85. result = 31 * result + (openType != null ? openType.hashCode() : 0);
  86. result = 31 * result + (logourl != null ? logourl.hashCode() : 0);
  87. result = 31 * result + (code != null ? code.hashCode() : 0);
  88. result = 31 * result + (classCode != null ? classCode.hashCode() : 0);
  89. result = 31 * result + (appid != null ? appid.hashCode() : 0);
  90. result = 31 * result + (classPriority != null ? classPriority.hashCode() : 0);
  91. return result;
  92. }
  93. }

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

  1. //清除重复数据 利用set集合的 无重复特点
  2. public static List removeDuplicate(List list) {
  3. HashSet h = new HashSet(list);
  4. list.clear();
  5. list.addAll(h);
  6. return list;
  7. }
  8. //根据排序字段进行排序
  9. public static List compareList(List<Menu> list){
  10. Collections.sort(list, new Comparator<Menu>() {
  11. @Override
  12. public int compare(Menu m1,Menu m2) {
  13. if (m1.getClassPriority() > m2.getClassPriority()) {
  14. return 1;
  15. }
  16. if (m1.getClassPriority() == m2.getClassPriority()) {
  17. return 0;
  18. }
  19. return -1;
  20. }
  21. });
  22. return list;
  23. }
  24. //递归 合并 去重
  25. public static void trecursive(List<Menu> list){
  26. try {
  27. for(Iterator<Menu> oneIter = list.iterator(); oneIter.hasNext();){
  28. Menu one = oneIter.next();
  29. for(Iterator<Menu> twoIter = list.iterator(); twoIter.hasNext();){
  30. Menu two = twoIter.next();
  31. //classcode为菜单的唯一标识 此处使用刚才重写的equals比较两个Menu对象也可
  32. if(one.getClassCode()!=null&&one.getClassCode().equals(two.getClassCode())){
  33. //如果进入 说明存在两个相同菜单 子菜单为空的情况 填充菜单 再去重
  34. if (one.getMenus() == null && two.getMenus() != null) {
  35. one.setMenus(two.getMenus());
  36. }
  37. if (two.getMenus() == null && one.getMenus() != null) {
  38. two.setMenus(one.getMenus());
  39. }
  40. if (two.getMenus() == null && one.getMenus() == null) {
  41. continue;
  42. }
  43. //否则合并 去重被合并菜单
  44. one.getMenus().addAll(two.getMenus());
  45. two.setMenus(one.getMenus());
  46. removeDuplicate(one.getMenus());
  47. compareList(one.getMenus());
  48. //递归
  49. trecursive(one.getMenus());
  50. }
  51. }
  52. }
  53. }catch (Exception e){
  54. e.printStackTrace();
  55. }
  56. }

发表评论

表情:
评论列表 (有 0 条评论,142人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JAVA字符串排序

    场景问题:在DB中我们可能会对数据的ID进行拼接,有时会存在部分ID相同的情况。此时需要对查询出来的这个拼接数据(type:String)进行去重。 > 实现:此处采...

    相关 C++ 循环输入、排序

    > 题目描述 > > 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留