ITPub博客

首页 > 应用开发 > Java > MySQL树形遍历(四)--代码优化

MySQL树形遍历(四)--代码优化

原创 Java 作者:壹頁書 时间:2015-12-07 19:44:36 0 删除 编辑
MySQL树形遍历(三) 
http://blog.itpub.net/29254281/viewspace-1867455/

这个程序实际上在模拟之前的那个SQL写法.
http://blog.itpub.net/29254281/viewspace-1851457/

但是实际上,使用递归造成了很多无效的重复的计算.
其实一个循环遍历,就搞定了.

  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.util.ArrayList;
  6. import java.util.Collections;
  7. import java.util.HashMap;
  8. import java.util.List;
  9. import java.util.Map;

  10. public class TreeScan {
  11.     private static String URL = "jdbc:mysql://127.0.0.1:3306/mvbox";
  12.     private static String USERNAME = "xx";
  13.     private static String PWD = "xx";

  14.     public static void main(String[] args) throws ClassNotFoundException, SQLException, CloneNotSupportedException {
  15.         Map<Integer, Employee> map = new HashMap<Integer, Employee>();
  16.         Class.forName("com.mysql.jdbc.Driver");
  17.         Connection con = DriverManager.getConnection(URL, USERNAME, PWD);
  18.         ResultSet rs = con.createStatement().executeQuery("select employee_id,manager_id from employees");
  19.         while (rs.next()) {
  20.             Employee e = new Employee();
  21.             e.setEmployeeId(rs.getInt("employee_id"));
  22.             e.setManagerId(rs.getInt("manager_id"));
  23.             map.put(e.getEmployeeId(), e);
  24.         }
  25.         rs.close();
  26.         con.close();

  27.         // 组合节点
  28.         treeScan(map);

  29.         System.out.println("自顶向下访问:");
  30.         printEmployee(getRoot(map));

  31.         System.out.println("自底向上访问:");
  32.         List<Employee> list = new ArrayList<Employee>(map.values());
  33.         Collections.sort(list);
  34.         for (Employee ee : list) {
  35.             System.out.println(ee.toString());
  36.         }

  37.     }

  38.     private static void printEmployee(Employee e) {
  39.         System.out.println(e.toString());
  40.         Collections.sort(e.getChildren());
  41.         for (Employee child : e.getChildren()) {
  42.             printEmployee(child);
  43.         }
  44.     }

  45.     private static Employee getRoot(Map<Integer, Employee> map) {
  46.         Employee e = map.values().iterator().next();
  47.         while (e.getManager() != null) {
  48.             e = e.getManager();
  49.         }
  50.         return e;
  51.     }

  52.     private static void treeScan(Map<Integer, Employee> map) {
  53.         for (Employee e : map.values()) {
  54.             findManager(map, e);
  55.         }
  56.     }

  57.     private static Employee findManager(Map<Integer, Employee> map, Employee e) {
  58.         Employee manager = map.get(e.getManagerId());
  59.         e.setManager(manager);
  60.         if (manager != null)
  61.             manager.getChildren().add(e);
  62.         return manager;
  63.     }

  64. }

  65. class Employee implements Comparable<Employee> {
  66.     private Integer employeeId = null;
  67.     private Integer managerId = null;
  68.     private Employee manager = null;
  69.     private List<Employee> children = new ArrayList<Employee>();

  70.     public List<Employee> getChildren() {
  71.         return children;
  72.     }

  73.     public void setChildren(List<Employee> children) {
  74.         this.children = children;
  75.     }

  76.     public Integer getEmployeeId() {
  77.         return employeeId;
  78.     }

  79.     public void setEmployeeId(Integer employeeId) {
  80.         this.employeeId = employeeId;
  81.     }

  82.     public Integer getManagerId() {
  83.         return managerId;
  84.     }

  85.     public void setManagerId(Integer managerId) {
  86.         this.managerId = managerId;
  87.     }

  88.     public Employee getManager() {
  89.         return manager;
  90.     }

  91.     public void setManager(Employee manager) {
  92.         this.manager = manager;
  93.     }

  94.     @Override
  95.     public int hashCode() {
  96.         final int prime = 31;
  97.         int result = 1;
  98.         result = prime * result + ((employeeId == null) ? 0 : employeeId.hashCode());
  99.         return result;
  100.     }

  101.     @Override
  102.     public boolean equals(Object obj) {
  103.         if (this == obj)
  104.             return true;
  105.         if (obj == null)
  106.             return false;
  107.         if (getClass() != obj.getClass())
  108.             return false;
  109.         Employee other = (Employee) obj;
  110.         if (employeeId == null) {
  111.             if (other.employeeId != null)
  112.                 return false;
  113.         } else if (!employeeId.equals(other.employeeId))
  114.             return false;
  115.         return true;
  116.     }

  117.     public String toString() {
  118.         if (this.manager != null) {

  119.             return this.manager.toString() + "/" + this.getEmployeeId();
  120.         }
  121.         return this.getEmployeeId().toString();
  122.     }

  123.     @Override
  124.     public int compareTo(Employee o) {
  125.         return this.toString().compareTo(o.toString());
  126.     }
  127. }

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-1867759/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: MySQL树形遍历(三)
下一篇: OpenResty最佳实践
请登录后发表评论 登录
全部评论

注册时间:2013-10-19

  • 博文量
    620
  • 访问量
    6339964