循环以从数据库表中获取无限的ArrayList / Lists

时间:2015-02-26 09:04:42

标签: java arraylist

我有这个代码从数据库表创建一个ArrayList,并将其拆分为3个独立的ArrayLists:

    table = conn.createStatement();
    String sql = "select * from tab1";
    ResultSet rs = table.executeQuery(sql);
    int columns = rs.getMetaData().getColumnCount();

    ArrayList<String> tempTable = new ArrayList<String>();
    while(rs.next())
    {
        int i = 1;
        while(i<=columns)
        {
            tempTable.add(rs.getString(i++));
        }
    }
    ArrayList<String> tempTable1 = new ArrayList<String>(tempTabe.subList(0, 9));
    String tableonLine = tempTable1.toString().replaceAll("[^a-zA-Z0-9\\-:.,]", " ");
    System.out.println("Sublist 1: "+tableonLine);

    ArrayList<String> tempTable2 = new ArrayList<String>(tempTable.subList(9, 18));
    String tableoneLine2 = tempTable2.toString().replaceAll("[^a-zA-Z0-9\\-:.,]", " ");
    System.out.println("Sublist 2: "+tableoneLine2);

    ArrayList<String> tempTable3 = new ArrayList<String>(tempTable.subList(18, 27));
    String tableoneLine3 = tempTable3.toString().replaceAll("[^a-zA-Z0-9\\-:.,]", " ");
    System.out.println("Sublist 3: "+tableoneLine3);

我的问题是,当我知道表中的行数时,代码可以依次拆分每一行,我需要使它无限扩展,以便应用程序依次获取每一行,并将这些行发送给一个二维字符串数组。谁能想到解决方案?

3 个答案:

答案 0 :(得分:2)

您可能需要一份清单:

List<List<String>> rows = new ArrayList<List<String>>();

行的外部列表的每个元素,内部列表的每个元素都是一个值。然后你的循环就像:

while(rs.next() {
  List<String> row = new ArrayList<String>();
  int i=1;
  while (i<=columns) {
    row.add(rs.getString(i);
  }
  rows.add(row);
}

这应该有效:)

答案 1 :(得分:1)

我认为您真正想要的是ArrayList固定长度String[]数组,您将ResultSet读入。您知道数据的宽度 - 它是从columns中的SQL查询返回的。但是你想让它继续你喜欢的行数,对吗?只需继续添加成员,即可使用ArrayList执行此操作。对于成员本身 - 它们可以是固定宽度(在您的情况下为9)阵列。

所以 - 改变你处理每一行的代码:

//Note - changed temp table to a List of String[] members,
//replacing one long list of Strings.
ArrayList<String[]> tempTable = new ArrayList<String[]>();

//Turn each row into a String[] and then add it to the list
while(rs.next())
{
    int i = 1; 
    String[] rowData = new String[columns];
    while(i<=columns)
    {
        rowData[i] = rs.getString(i++);
    }
    tempTable.add(rowData);
}

注意 - 从1开始我很不寻常 - 你确定你不想在0开始吗? Java索引到数组和列表是基于零的。

然后,一旦完成,您就有了一个ArrayList,其size()是您拥有的行数,其成员是固定长度String数组。将其转换为2D String数组变得非常简单:

String[][] outArr = new String[tempTable.size()][columns];
int i = 0;
for (rowArr : tempTable)
{
    System.arraycopy(rowArr,0,outArr[i++],0,columns);
}

您现在拥有了outArr所需的2D字符串数组。


注意 如果数据的行宽可变 - 您需要使用List List方法String[][] 3}}。原理是一样的 - 它只是意味着将结果放入2D字符串数组的代码更难,因为您必须找到最大宽度行来标注outArr。处理SQL查询时不需要这样做。

最后的注释 您的方法很好 - 如果有点难以阅读。如果您希望继续使用这种方式 - 您可以按如下方式生成子列表(替换您逐个执行此操作的代码)。不过,这是一种有点令人费解的做事方式。我还根据评论填写// get the dimensions of your 2D array from your tempTable size // which will be columns * rows long String[][] outArr = new String[tempTable.size()/columns][columns] for (int subStart = 0; subStart < tempTable.size(); subStart += columns) { ArrayList<String> tempTable1 = new ArrayList<String>( tempTable.subList(subStart, subStart+columns)); int rownum = subStart / columns; // each "tempTable1" represents a row in the table - write // this element by element to your 2D String array. for (int i = 0; i < columns; i++) { outArr[rownum][i] = tempTable1.get(i); } String tableonLine = tempTable1.toString().replaceAll("[^a-zA-Z0-9\\-:.,]", " "); System.out.println("Sublist "+ rownum + ": "+tableonLine); } 2D数组,这似乎是要求的关键

{{1}}

答案 2 :(得分:0)

对此的解决方案实际上比我初想的要简单得多:

<强>解决

public static String[][] TableToArray() throws SQLException
{
    String[][] dbTable = null;
    table = conn.createStatement();
    String sql = "select * from Java_Test_Profiles";
    ResultSet rs = table.executeQuery(sql);
    rs.last();
    int rowNumb = rs.getRow();
    ResultSetMetaData rsmd = rs.getMetaData();
    int columnS = rsmd.getColumnCount();

    dbTable= new String[rowNumb][columnS];

    int i=0;
    while(rs.next() && i<rowNumb)
    {
        for(int j=0;j<columnS;i++)
        {
            dbTable[i][j] = rs.getString(j+1);
        }
        i++;
    }
    return dbTable; 
}