我有这个代码从数据库表创建一个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);
我的问题是,当我知道表中的行数时,代码可以依次拆分每一行,我需要使它无限扩展,以便应用程序依次获取每一行,并将这些行发送给一个二维字符串数组。谁能想到解决方案?
答案 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;
}