您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> Java >> 求一Java递归算法

求一Java递归算法

来源:网络整理     时间:2016/7/24 17:39:54     关键词:

关于网友提出的“ 求一Java递归算法”问题疑问,本网通过在网上对“ 求一Java递归算法”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 求一Java递归算法
描述:

现有A、B、C三张表,B为A和C的关系表。
1.先根据传入的一个A表的AID在B表中查出flag为1的C表的CID(一对多关系),然后根据查询到的CID在B表中查询flag为2的A表的AID(一对多关系)。
2.根据1中查询到的AID再重复执行1中步骤,直到查询到的AID为空为止。
3.将所查询到的所有AID放入一个数组或者List中。请将上诉算法该如何实现,麻烦附上源码,谢谢! 


解决方案1:

根据错误信息看出,报了NullPointerException
原因是因为没有抽到数据,而使用result.wasNull()方法。
修改方法:将if (!result.wasNull())判断去掉

解决方案2:

 求一Java递归算法用SQL比较好吧 递归太慢了吧

解决方案3:

不知道这样的DEMO行不行,没有使用递归,改一下SQL应该就可以测试了。

package com.cua.testdemo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
public class Demo42 {
    private Connection conn = null;
    protected Connection getConn() {
        return conn;
    }
    protected void setConn(Connection conn) {
        this.conn = conn;
    }
    protected boolean closeConn() {
        boolean result = Boolean.TRUE;
        try {
            if (conn != null) conn.close();
        } catch (SQLException e) {
            result = Boolean.FALSE;
        }
        return result;
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        Demo42 demo = new Demo42();
        try {
            // 连接数据库
            Class.forName("org.gjt.mm.mysql.Driver");
            demo.setConn(DriverManager.getConnection("jdbc:mysql://localhost:3306/ctc", "root", "root"));
            if (demo.getConn() == null) {
                System.out.println("Connection mysql failed!");
                System.exit(0);
            }
            // 所有的AID存放入数组
            MergeList allaid = new MergeList();
            // 初期传入的AID
            allaid.add("A0");
            int index = -1;
            while (++index < allaid.size()) {
                allaid.mergeAddAll(demo.getDataByAid(allaid.get(index)));
            }
            // 最终所有满足条件的AID,并格式化输出
            System.out.println(allaid.join());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (!demo.closeConn()) System.out.println("close connection failed!");;
        }
    }
    /**
     * 根据AID取数据库数据
     * @param aid
     * @return
     */
    public List getDataByAid(String aid) {
        PreparedStatement pst = null;
        ResultSet result = null;
        List list = null;
        try {
            pst = getConn().prepareStatement("SELECT AID FROM R_A2C WHERE CID IN (SELECT CID FROM R_A2C WHERE AID = ? AND FLAG = 1) AND FLAG = 2");
            pst.setString(1, aid);
            result = pst.executeQuery();
            if (!result.wasNull()) list = new ArrayList();
            while (result.next()) {
                list.add(result.getString(1));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (result != null) result.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if (pst != null) pst.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return list;
    }
}
class MergeList extends ArrayList {
    private static final long serialVersionUID = 1L;
    public void mergeAdd(T o) {
        if (!super.contains(o)) super.add(o);
    }
    public void mergeAddAll(Collection c) {
        if (c.isEmpty()) return;
        for (Iterator it = c.iterator(); it.hasNext();) {
            this.mergeAdd(it.next());
        }
    }
    public String join() {
        return this.join(null);
    }
    public String join(String mark) {
        if (super.isEmpty()) return "";
        if (mark == null) mark = ",";
        StringBuffer buf = new StringBuffer();
        for (Iterator it = super.iterator(); it.hasNext();) {
            buf.append(it.next()).append(mark);
        }
        buf.deleteCharAt(buf.length() - 1);
        return buf.toString();
    }
}

这是测试数据
CREATE TABLE R_A2C (
AID VARCHAR(10),
CID VARCHAR(10),
FLAG INTEGER
);
INSERT INTO R_A2C VALUES ('A0', 'B1', 1);
INSERT INTO R_A2C VALUES ('A1', 'B1', 2);
INSERT INTO R_A2C VALUES ('A1', 'B0', 1);
INSERT INTO R_A2C VALUES ('A2', 'B0', 1);
INSERT INTO R_A2C VALUES ('A3', 'B2', 2);
INSERT INTO R_A2C VALUES ('A4', 'B3', 1);
INSERT INTO R_A2C VALUES ('A5', 'B4', 2);
INSERT INTO R_A2C VALUES ('A6', 'B5', 1);
INSERT INTO R_A2C VALUES ('A7', 'B0', 1);
INSERT INTO R_A2C VALUES ('A6', 'B6', 2);
INSERT INTO R_A2C VALUES ('A5', 'B0', 2);
INSERT INTO R_A2C VALUES ('A3', 'B7', 2);
INSERT INTO R_A2C VALUES ('A3', 'B5', 2);
INSERT INTO R_A2C VALUES ('A3', 'B5', 1);
INSERT INTO R_A2C VALUES ('A0', 'B0', 2);
INSERT INTO R_A2C VALUES ('A1', 'B9', 1);
INSERT INTO R_A2C VALUES ('A3', 'B3', 1);
INSERT INTO R_A2C VALUES ('A9', 'B2', 2);
INSERT INTO R_A2C VALUES ('A1', 'B0', 2);
COMMIT;
解决方案4:

最简单的方法就是采用递归,但是性能很低下。
如果希望采用优化的方法来做的话,需要综合考虑很多因素,A、B、C表中的数据量各有多大,并发量有多大,数据库服务器内存多大,应用服务器内存多大等综合因素。如果数据量不大的情况下,不采用递归模式,大大减少数据库读取次数将能够大大提高性能。


以上介绍了“ 求一Java递归算法”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2892414.html

相关图片

相关文章