標籤:無限分類-java 遞迴 資料結構
之前接觸到一個無限分類,這次用到了,就自己寫了一下,貼出來供參考。
資料庫類別表的設計以及資料
-- ------------------------------ Table structure for msg_type-- ----------------------------CREATE TABLE `msg_type` ( `id` int(11) NOT NULL AUTO_INCREMENT, `typename` varchar(50) DEFAULT NULL, `remarks` varchar(200) DEFAULT NULL, `parentid` int(11) DEFAULT NULL, `state` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;INSERT INTO `msg_type` VALUES (‘1‘, ‘苗木‘, null, ‘0‘, ‘1‘);INSERT INTO `msg_type` VALUES (‘2‘, ‘花卉‘, null, ‘0‘, ‘1‘);INSERT INTO `msg_type` VALUES (‘3‘, ‘景觀小品‘, null, ‘0‘, ‘1‘);INSERT INTO `msg_type` VALUES (‘4‘, ‘松樹‘, null, ‘1‘, ‘1‘);INSERT INTO `msg_type` VALUES (‘5‘, ‘落葉松‘, null, ‘4‘, ‘1‘);INSERT INTO `msg_type` VALUES (‘6‘, ‘雪松‘, null, ‘4‘, ‘1‘);INSERT INTO `msg_type` VALUES (‘7‘, ‘楊樹‘, null, ‘1‘, ‘1‘);INSERT INTO `msg_type` VALUES (‘8‘, ‘速生楊‘, null, ‘7‘, ‘1‘);
資料庫類別表對應的實體
/** * 資訊類別實體 * @Description TODO * @author zk * @version 1.0 * @date 2015-4-5 下午5:53:48 */public class MessageType { private int id; private String typename ; private String remarks ; private int parentid; private int state; public int getParentid() { return parentid; } public void setParentid(int parentid) { this.parentid = parentid; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTypename() { return typename; } public void setTypename(String typename) { this.typename = typename; } public String getRemarks() { return remarks; } public void setRemarks(String remarks) { this.remarks = remarks; } public int getState() { return state; } public void setState(int state) { this.state = state; }}
類別實體中間處理
/*** 類別 顯示中間 處理* * @Description TODO* @author zk* @version 1.0* @date 2015-4-11 上午10:56:03*/public class MessageTypeLev extends MessageType { private int lev; public int getLev() { return lev; } public void setLev(int lev) { this.lev = lev; } /** * 類型的轉換 * @param messageType */public void from(MessageType messageType) { this.setId(messageType.getId()); this.setParentid(messageType.getParentid()); this.setRemarks(messageType.getRemarks()); this.setState(messageType.getState()); this.setTypename(messageType.getTypename());} }
控制器請求資料庫核心
----------------------核心部分------------------------------ //調用業務層擷取類別表的全部資料 MessageTypeService ms = new MessageTypeService(); List<MessageType> mlist = ms.findAll(); //最終需要得到的資料【經過無限分類 排序之後的】 List<MessageTypeLev> backList = new ArrayList<MessageTypeLev>(); //對mlist集合進行排序 並把排序之後報到到backlist中 recMessageType(backList, mlist, 0, 0); //對排序後的資料 再次處理 並且輸出 for (MessageTypeLev messageType : backList) { messageType.setTypename(setNBSP(messageType) + messageType.getTypename()); System.out.println(messageType.getTypename()); } ------------------------核心部分---------------------------- /** * 根據層級的關係處理 類別名稱顯示 * @param messageType * @return */ private String setNBSP(MessageTypeLev messageType) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < messageType.getLev(); i++) { sb.append("---"); } return sb.toString(); }/** * 對無限分類集合 數組進行排序 * * @param mlist 要排序的集合 * @param id 父id 為0開始 * @param lev 層數 為了顯示縮排 而添加的 */public void recMessageType(List<MessageTypeLev> bList, List<MessageType> mlist, int id, int lev) { for (MessageType messageType : mlist) { if (messageType.getParentid() == id) { MessageTypeLev messageTypeLev = new MessageTypeLev(); /*為了顯示層數 而 又封裝了一個MessageTypeLev 類型,而且在繼承原來MessageType 還做了一下轉換 [messageTypeLev.from(messageType); ]此處方法覺得有點 小小的不可取 ,以後解決 ,目前先解決問題再說 */ messageTypeLev.from(messageType); messageTypeLev.setLev(lev); bList.add(messageTypeLev); recMessageType(bList, mlist, messageType.getId(), lev + 1); } }}
上面輸出運行效果
苗木 ---松樹------落葉松------雪松---楊樹------速生楊花卉景觀小品
前台介面顯示處理,一般儲存到request域對象裡面 ,前台取值
下拉框的顯示
<select name="typeid" width="40"> <option value="">--請選擇--</option> <c:forEach var ="category" items="${backlist }"> <option value="${category.id }">${category.typename }</option> </c:forEach> </select>
至此 ,商品的無限分類 以及最上層顯示 以及告一段落,待續添加分類 以及邏輯判斷,核心代碼以及思路會貼上。轉載請聲明,謝謝。
java代碼實現商品類別的無限級分類顯示