在JavaWeb的相關開發中經常會涉及到多級菜單的展示,為了方便菜單的管理需要使用數據庫進行支持,本例采用相關算法講數據庫中的條形記錄進行相關組裝和排序講菜單組裝成樹形結構。
首先是需要的JavaBean
import java.io.Serializable;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.Date;import java.util.Iterator;import java.util.List;/** * <Description> 菜單擴展<br> */public class MenuExt implements Serializable { /** * 菜單ID */ private Long id; /** * 菜單名稱 */ private String name; /** * 菜單地址 */ private String url; /** * 菜單圖標 */ private String icon; /** * 父菜單ID */ private Long parentId; /** * 子菜單 */ private List<MenuExt> children = new ArrayList<MenuExt>(); /** * 菜單順序 */ private Integer ordby; /** * 菜單狀態 */ private String state; //省略Getter和Setter /** * * <Description> 孩子節點排序<br> * */ public void sortChildren() { Collections.sort(children, new Comparator<MenuExt>() { @Override public int compare(MenuExt menu1, MenuExt menu2) { int result = 0; Integer ordby1 = menu1.getOrdby(); Integer ordby2 = menu2.getOrdby(); Long id1 = menu1.getId(); Long id2 = menu2.getId(); if (null != ordby1 && null != ordby2) { result = (ordby1 < ordby2 ? -1 : (ordby1 == ordby2 ? 0 : 1)); } else { result = (id1 < id2 ? -1 : (id1 == id2 ? 0 : 1)); } return result; } }); // 對每個節點的下一層節點進行排序 for (Iterator<MenuExt> it = children.iterator(); it.hasNext();) { it.next().sortChildren(); } } public List<MenuExt> getChildren() { return children; } public void setChildren(List<MenuExt> children) { this.children = children; }}Java算法
public static List<MenuExt> createTreeMenus(List<MenuExt> menus) { List<MenuExt> treeMenus = null; if (null != menus && !menus.isEmpty()) { // 創建根節點 MenuExt root = new MenuExt(); root.setName("菜單根目錄"); // 組裝Map數據 Map<Long, MenuExt> dataMap = new HashMap<Long, MenuExt>(); for (MenuExt menu : menus) { dataMap.put(menu.getId(), menu); } // 組裝樹形結構 Set<Entry<Long, MenuExt>> entrySet = dataMap.entrySet(); for (Entry<Long, MenuExt> entry : entrySet) { MenuExt menu = entry.getValue(); if (null == menu.getParentId() || 0 == menu.getParentId()) { root.getChildren().add(menu); } else { dataMap.get(menu.getParentId()).getChildren().add(menu); } } // 對樹形結構進行二叉樹排序 root.sortChildren(); treeMenus = root.getChildren(); } return treeMenus; }以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答