Java JDBC-填充2D双数组的问题

Java JDBC-填充2D双数组的问题,java,jdbc,multidimensional-array,Java,Jdbc,Multidimensional Array,我正在通过JDBC连接从PostgreSQL数据库的表中检索结果集,如下所示: "501.511346, 503.472045, 505.447591, 501.192024, 504.137371, 500.790352, 506.726137, 508.266889, 506.879129, 503.036632" "506.233533, 504.731789, 507.639155, 507.187112, 501.124606, 508.558729,504.037900, 505.2

我正在通过JDBC连接从PostgreSQL数据库的表中检索结果集,如下所示:

"501.511346, 503.472045, 505.447591, 501.192024, 504.137371, 500.790352, 506.726137, 508.266889, 506.879129, 503.036632"
"506.233533, 504.731789, 507.639155, 507.187112, 501.124606, 508.558729,504.037900, 505.246124, 505.314278, 500.101784"
"509.075946, 505.219091, 505.953530, 501.323737, 509.691705, 500.110447, 505.315793, 503.922326, 505.259513, 507.176139"
"505.161837, 501.063333, 503.402369, 503.944111, 502.329003, 501.593900, 508.902708, 503.022083, 505.456198, 500.821379"
"501.136874, 507.282628, 501.076124, 504.313085, 502.092685, 504.601038, 508.905852, 507.602457, 502.363248, 501.228881"
"507.790364, 500.034138, 501.491094, 507.916393, 501.683380, 503.665745, 507.908477, 504.317156, 504.921323, 508.663319"
"501.013448, 501.443771, 500.449935, 501.570703, 501.112750, 507.936670, 506.626647, 504.746571, 501.478473, 505.641617"
"501.553313, 502.492668, 504.332290, 503.666099, 506.629541, 500.592711, 500.896930, 502.970319, 501.116483, 504.481986"
"502.187111, 502.145824, 509.532465, 500.348489, 503.842839, 508.749411, 500.718773, 508.422647, 508.683536, 505.489182"
"509.526615, 504.127884, 503.502820, 506.184630, 507.451289, 507.783623, 503.639020, 506.767338, 506.089402, 506.095711"
"505.050268, 504.379683, 508.883864, 508.821655, 506.592373, 507.762016, 503.664888, 507.020359, 502.166903, 504.881668"
"503.641401, 502.152418, 501.656423, 509.706045, 505.032023, 509.798445, 507.760368, 502.113529, 507.615546, 506.032260"
"506.855262, 508.673852, 503.902280, 507.339752, 509.106561, 503.817907, 504.675336, 502.857339, 505.761561, 505.328955"
"509.216366, 503.236089, 509.705565, 500.589984, 500.818828, 505.180683, 503.657360, 505.528898, 509.506768, 502.728268"
"507.932913, 505.611162, 500.728144, 502.882686, 500.979144, 506.991179, 500.943360, 506.693182, 508.148536, 508.699568"
"508.946498, 501.745562, 502.265949, 503.192731, 502.030673, 507.678642, 500.089286, 504.847314, 507.204066, 500.696839"
"507.151703, 505.898623, 508.330869, 504.758373, 503.307971, 500.713862, 506.714869, 503.989853, 508.461387, 507.387292"
"508.271230, 507.405013, 502.357225, 506.591855, 504.613121, 504.768269, 501.416726, 505.613160, 501.375562, 501.625350"
"504.183084, 507.494983, 505.040833, 505.075503, 504.161549, 500.649583, 507.194630, 503.392844, 505.336177, 508.217170"
"508.924550, 503.218437, 504.534036, 505.692131, 508.263250, 503.923185, 507.255442, 506.786683, 501.893640, 503.278230"
"506.812050, 500.469390, 506.258835, 500.542808, 502.774340, 506.703418, 504.855838, 508.988294, 504.825021, 503.711878"
"504.940812, 508.431433, 507.301498, 505.920257, 501.246557, 501.256791, 500.599958, 502.064444, 500.933950, 501.989907"
"500.374969, 504.333468, 501.590108, 504.684638, 501.577986, 507.462334, 503.769062, 501.015270, 506.213296, 504.483580"
"504.733616, 506.757830, 503.770166, 505.921616, 505.463712, 503.765199, 502.936621, 502.479458, 507.342924, 508.919453"
"509.786083, 504.510082, 501.687019, 509.471297, 503.188882, 507.377933, 508.997906, 509.912943, 504.786779, 503.013641"
"503.474216, 504.125196, 505.592858, 506.826637, 505.118236, 500.803693, 502.614498, 500.703702, 506.820342, 504.832302"
"500.387248, 504.569592, 502.562114, 504.589547, 508.552309, 509.541123, 500.961317, 501.182442, 508.204940, 505.628783"
"501.791401, 502.100932, 501.150022, 509.534479, 508.850065, 502.757766, 507.866282, 500.849425, 509.927472, 500.098215"
"504.735886, 509.656796, 500.461879, 500.453160, 508.434995, 506.671135, 500.992930, 505.550642, 507.093285, 503.311201"
不幸的是,此结果集中的每一行都是一个逗号分隔的长字符串。然而,这不是问题所在,因为我在java代码中将返回的每一行解析为一个双精度数组。我的最终目标是从这个结果集创建一个二维双打数组。以下是我为实现这一目标而编写的方法,目前的情况如下:

    public double[][] getMatrix(int x, int y) {

    int row = getRowDim(x, y); //separate method to get row dimension
    int col = getColDim(x, y); //separate method to get column dimension
    double[][] matrix = new double[row][col];   
    String[] intermediateArray  = new String[col];
    String px = "";
    try {
        conn = dataSource.getConnection();
    } catch (SQLException e1) {
        e1.printStackTrace();
    }
    try {
            PreparedStatement p = conn.prepareStatement(getMatrix); //getMatrix query called from SQL prop file
            p.setInt(1, x);
            p.setInt(2, y);
            ResultSet r = p.executeQuery();
            int count=0;
            while(r.next())
            {
                px = r.getString("prices");
                intermediateArray = px.split(",", -1);
            }
            parsed = new double[intermediateArray.length]; 
            for (int i = 0; i<intermediateArray.length; i++) {
                parsed[i] = Double.valueOf(intermediateArray[i]);
            }
                for(int i=0;i<row;i++){
                    for(int j=0;j<col;j++){
                        if(count==parsed.length) break;
                        matrix[i][j]=parsed[(count)];
                        count++;
                    }
                }
                conn.close();

        } catch (SQLException e) {
            logger.error("***** SQL EXCEPTION *****");
                 e.printStackTrace();
    }
    return matrix;
}

在其他地方填充零值。我很确定我把其中一个回路放错了位置,但我一辈子都找不到它的位置。如果有人能给我指出正确的方向,我将不胜感激。如果我遗漏了任何必要的细节,请询问,谢谢

如果您使用的是Java 8,您只需使用:

String[] intermediateArray  = new String[col];
int index = 0;
while(r.next()){
    intermediateArray[i++] = r.getString("prices");
}
double[][] matrix = Arrays.stream(intermediateArray)
        .map(s -> Stream.of(s.split(",")).mapToDouble(Double::parseDouble).toArray())
        .toArray(double[][]::new);

其思想是:将所有结果放在一个数组或列表中,然后使用我的一段代码将这个字符串数组转换为一个二维双精度数组()

代码中有一些东西需要更改。在处理完结果集之前,您无法确定预期的行数(即使您显式查询特定的行,也希望代码安全)。因此,您可能需要使用灵活的长度数据结构

但是,您的问题是使用了相同的变量,并在while循环中覆盖了它。下面是同一代码的稍微修改版本:

int row = getRowDim(x, y);
int col = getColDim(x, y);

double[][] matrix; //length of array cannot be guaranteed before reading the result set.

try {
    conn = dataSource.getConnection();
} catch (SQLException e1) {
    e1.printStackTrace();
}

List<double[]> matrixList = new ArrayList<>(); //rather use an array list to avoid unexpected index errors

try {
    PreparedStatement p = conn.prepareStatement(getMatrix);
    p.setInt(1, x);
    p.setInt(2, y);
    ResultSet r = p.executeQuery();

    while(r.next())
    {
        String px = r.getString("prices");
        String[] intermediateArray  = px.split(",", -1);

        double[] parsed = new double[intermediateArray.length];
        for (int i = 0; i < intermediateArray.length; i++) {

            //use Double.parseDouble(String) to avoid unnecessary boxing/unboxing
            parsed[i] = Double.parseDouble(intermediateArray[i]);
        }

        matrixList.add(parsed);
    }

    matrix = new double[matrixList.size()][];
    conn.close();

    int index = 0;
    for(double[] currentRow: matrixList) {
        matrix[index++] = currentRow;
    }

    return matrix;
} catch (SQLException e) {
    logger.error("***** SQL EXCEPTION *****");
    e.printStackTrace();
    return new double[0][0];
}
int row=getRowDim(x,y);
int col=getColDim(x,y);
双[]矩阵//在读取结果集之前,无法保证数组的长度。
试一试{
conn=dataSource.getConnection();
}捕获(SQLException e1){
e1.printStackTrace();
}
List matrixList=新建ArrayList()//而是使用数组列表来避免意外的索引错误
试一试{
PreparedStatement p=conn.prepareStatement(getMatrix);
p、 setInt(1,x);
p、 setInt(2,y);
结果集r=p.executeQuery();
while(r.next())
{
字符串px=r.getString(“价格”);
字符串[]intermediateArray=px.split(“,”,-1);
double[]parsed=新的double[intermediateArray.length];
for(int i=0;i
您正在while循环中耗尽结果集,同时覆盖
intermediateArray
。这个变量可能应该在
while
循环中声明,并添加到同一循环中的2D数组中,这要感谢@ErnestKiwele的提示响应。我刚刚在while中声明了“intermediateArray”,并将其写入同一循环中的2D数组,但是它只是将结果集的第一行写入矩阵的第一行,其他所有地方都是零值。不过,我会仔细考虑你的建议,因为我相信你是正确的。你可能想在
最后
块中移动
连接关闭()
,谢谢@MauricePerry的输入。这是一个很好的观点,在这段代码中我需要做很多简单的家务活,我将继续讨论。再次感谢你,我的好先生,你挽救了这一天。这正是我所希望的答案。它没有偏离原始代码太远,完全解决了这个问题。关于矩阵的维度,我必须查询行数和列数的单独方法基本上是在同一个结果集上,因此在这种情况下,我非常确信矩阵的大小不会有问题。我对你表示感谢,并投你一票。接受你的回答。再次感谢。非常感谢@YCF_L的回复。这是一个很好的解决方案,比我自己的代码要简洁得多。我已经将已接受答案中的解决方案放入代码中,并且效果良好。非常感谢你的意见。
int row = getRowDim(x, y);
int col = getColDim(x, y);

double[][] matrix; //length of array cannot be guaranteed before reading the result set.

try {
    conn = dataSource.getConnection();
} catch (SQLException e1) {
    e1.printStackTrace();
}

List<double[]> matrixList = new ArrayList<>(); //rather use an array list to avoid unexpected index errors

try {
    PreparedStatement p = conn.prepareStatement(getMatrix);
    p.setInt(1, x);
    p.setInt(2, y);
    ResultSet r = p.executeQuery();

    while(r.next())
    {
        String px = r.getString("prices");
        String[] intermediateArray  = px.split(",", -1);

        double[] parsed = new double[intermediateArray.length];
        for (int i = 0; i < intermediateArray.length; i++) {

            //use Double.parseDouble(String) to avoid unnecessary boxing/unboxing
            parsed[i] = Double.parseDouble(intermediateArray[i]);
        }

        matrixList.add(parsed);
    }

    matrix = new double[matrixList.size()][];
    conn.close();

    int index = 0;
    for(double[] currentRow: matrixList) {
        matrix[index++] = currentRow;
    }

    return matrix;
} catch (SQLException e) {
    logger.error("***** SQL EXCEPTION *****");
    e.printStackTrace();
    return new double[0][0];
}