1. 程式人生 > >java遞迴簡單例項

java遞迴簡單例項

1.自己的第一篇部落格,想把自己的覺得有用的記錄下來,也可以鍛鍊自己的表達能力。內容談不上豐富,如果寫的不好,請大家多多包涵。

2.廢話不多說,就是幹,先準備下指令碼

drop TABLE IF EXISTS category;
CREATE TABLE `category` (
  `id` int(11) NOT NULL,
  `pid` int(11) DEFAULT NULL,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO category VALUES (1,0,'手機');
INSERT INTO category VALUES (2,0,'電腦');
INSERT INTO category VALUES (3,1,'蘋果手機');
INSERT INTO category VALUES (4,1,'三星手機');
INSERT INTO category VALUES (5,2,'筆記本');
INSERT INTO category VALUES (6,2,'桌上型電腦');
INSERT INTO category VALUES (7,3,'iphone6');
INSERT INTO category VALUES (8,3,'iphone7');

SELECT * FROM category;

----2.1 新建一個品類表,插入幾條記錄,id不能重複,每條資料都是id,pid這種形式


3.新建一個Java專案

----3.1 引入mysql-connector-java-5.1.6

----3.2 新建實體category.java

public class Category {
    private Integer id;
    private Integer pid;
    private String name;
    private List<Category> childList;// 子集合

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getPid() {
        return pid;
    }

    public void setPid(Integer pid) {
        this.pid = pid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Category> getChildList() {
        return childList;
    }

    public void setChildList(List<Category> childList) {
        this.childList = childList;
    }

    @Override
    public String toString(){
        return "id:" + id +",pid:" + pid +",name:" + name +",childList:" + childList+"";
    }



-----3.3測試類test.java
public class Test {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456");
            stmt = conn.createStatement();
            String sql = "select id,pid,name from category";
            ResultSet rs = stmt.executeQuery(sql);
            List<Category> list = new ArrayList<Category>();
            while (rs.next()) {
                Category cate = new Category();
                cate.setId(rs.getInt("id"));
                cate.setPid(rs.getInt("pid"));
                cate.setName(rs.getString("name"));
                list.add(cate);
                
            }
            //遞迴方法
            list = dgCategoryList(list,1);//查詢手機下面的
            System.out.println(list);
            rs.close();
            stmt.close();
            conn.close();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
    /**
     * 遞迴方法(品類遞迴)
     *
     * @param categoryList
     * @param parentId
     * @return
     */
    private static List<Category> dgCategoryList(List<Category> categoryList, Integer parentId)
    {
        List<Category> childList = new ArrayList<Category>();
        for (Category c : categoryList)
        {
            if (null != c && null != c.getId() && null != c.getPid())
            {
                int id = c.getId();
                int pid = c.getPid();
                if (parentId==pid)
                {
                    List<Category> childs = dgCategoryList(categoryList, id);
                    c.setChildList(childs);
                    childList.add(c);
                }
            }
        }
        return childList;
    }
}

-----3.4控制檯列印




結果:手機下面有蘋果手機和三星手機,蘋果手機有iphone6,iphone7,三星手機下面沒有。

總結:資料庫裡的記錄是id和父pid的資料,而業務需要是把某一個品類所有的子品類及子品類下面包含的。這個時候在記憶體中做遞迴