MySQL樹形遍歷(三)
MySQL雖然也可以實現Oracle的sys_connect_by_path功能.但是效能很差.
詳見:
http://blog.itpub.net/29254281/viewspace-1851457/
其實這種還是用程式算比較好.
本質還是用了遞迴,用程式做遞迴,比用SQL做遞迴真是簡單多了.
JAVA結果和資料庫運算結果比對:
ITPUB的程式碼貼上不支援泛型,估計是根據正則過濾了...
需要補全泛型才能執行.
詳見:
http://blog.itpub.net/29254281/viewspace-1851457/
其實這種還是用程式算比較好.
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- public class TreeScan {
- private static String URL = "jdbc:mysql://127.0.0.1:3306/mvbox";
- private static String USERNAME = "xx";
- private static String PWD = "xx";
- public static void main(String[] args) throws ClassNotFoundException, SQLException, CloneNotSupportedException {
- List list = new ArrayList();
- Class.forName("com.mysql.jdbc.Driver");
- Connection con = DriverManager.getConnection(URL, USERNAME, PWD);
- ResultSet rs = con.createStatement().executeQuery("select employee_id,manager_id from employees");
- while (rs.next()) {
- Employee e = new Employee();
- e.setEmployeeId(rs.getInt("employee_id"));
- e.setManagerId(rs.getInt("manager_id"));
- list.add(e);
- }
- rs.close();
- con.close();
- treeScan(list);
- }
- private static void treeScan(List list) throws CloneNotSupportedException {
- for (Employee e : list) {
- Employee e1 = findManager(list, e);
- while (e1 != null) {
- e1 = findManager(list, e1);
- }
- }
- Collections.sort(list);
- for (Employee ee : list) {
- System.out.println(ee.toString());
- }
- }
- private static Employee findManager(List list, Employee e) throws CloneNotSupportedException {
- Employee manager = null;
- for (Employee em : list) {
- if (em.getEmployeeId().equals(e.getManagerId())) {
- manager = new Employee();
- manager.setEmployeeId(em.getEmployeeId());
- manager.setManagerId(em.getManagerId());
- e.setManager(manager);
- return manager;
- }
- }
- return manager;
- }
- }
- class Employee implements Comparable {
- private Integer employeeId = null;
- private Integer managerId = null;
- private Employee manager = null;
- public Integer getEmployeeId() {
- return employeeId;
- }
- public void setEmployeeId(Integer employeeId) {
- this.employeeId = employeeId;
- }
- public Integer getManagerId() {
- return managerId;
- }
- public void setManagerId(Integer managerId) {
- this.managerId = managerId;
- }
- public Employee getManager() {
- return manager;
- }
- public void setManager(Employee manager) {
- this.manager = manager;
- }
- public String toString() {
- if (this.manager != null) {
- return this.manager.toString() + "/" + this.getEmployeeId();
- }
- return this.getEmployeeId().toString();
- }
- @Override
- public int compareTo(Employee o) {
- return this.toString().compareTo(o.toString());
- }
- }
本質還是用了遞迴,用程式做遞迴,比用SQL做遞迴真是簡單多了.
JAVA結果和資料庫運算結果比對:
ITPUB的程式碼貼上不支援泛型,估計是根據正則過濾了...
需要補全泛型才能執行.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1867455/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL樹形遍歷MySql
- MySQL 實現樹形的遍歷MySql
- MySQL樹形遍歷(四)--程式碼優化MySql優化
- Related to Oracle SQL 關於樹形資料的遍歷OracleSQL
- Javascript樹(一):廣度遍歷和深度遍歷JavaScript
- 二叉樹建立,前序遍歷,中序遍歷,後序遍歷 思路二叉樹
- 二叉樹的建立、前序遍歷、中序遍歷、後序遍歷二叉樹
- 二叉樹---遍歷二叉樹
- 二叉樹遍歷二叉樹
- 二叉樹的廣度遍歷和深度遍歷()二叉樹
- C++樹——遍歷二叉樹C++二叉樹
- LintCode 前序遍歷和中序遍歷樹構造二叉樹二叉樹
- 二叉樹遍歷方法二叉樹
- 樹的遍歷c/c++C++
- 二叉樹遍歷 -- JAVA二叉樹Java
- 二叉樹的遍歷二叉樹
- 掌握 React 元件樹遍歷技巧React元件
- JAVA遍歷二叉樹Java二叉樹
- 二叉樹(BST)中序遍歷的三種方法二叉樹
- 使用遞迴遍歷並轉換樹形資料(以 TypeScript 為例)遞迴TypeScript
- 玩轉二叉樹(樹的遍歷)二叉樹
- 二叉樹的遍歷 → 不用遞迴,還能遍歷嗎二叉樹遞迴
- 二叉樹的前序、中序、後序三種遍歷二叉樹
- 一文弄懂二叉樹的三種遍歷方式二叉樹
- 完全二叉樹的遍歷二叉樹
- 迴圈遍歷二叉樹二叉樹
- 二叉樹四種遍歷二叉樹
- 二叉樹--後序遍歷二叉樹
- 層序遍歷二叉樹二叉樹
- 面試中很值得聊的二叉樹遍歷方法——Morris遍歷面試二叉樹
- 根據前序遍歷序列、中序遍歷序列,重建二叉樹二叉樹
- 根據二叉樹的前序遍歷和中序遍歷輸出二叉樹;二叉樹
- 建立二叉樹:層次遍歷--樹的寬度高度,後序遍歷--祖先節點二叉樹
- 23:二維陣列回形遍歷陣列
- [js] 根據元素ID遍歷樹形結構,查詢到所有父元素IDJS
- Python實現二叉樹的三種深度遍歷方法!Python二叉樹
- 資料結構與演算法——二叉樹的前序遍歷,中序遍歷,後序遍歷資料結構演算法二叉樹
- 二叉樹的深度優先遍歷和廣度優先遍歷二叉樹