我有一个由MySQL数据库的ResultSet填充的2D字符串数组。我需要一种方法,每次匹配一个值时将行数减少1。此过程仅运行一次/操作。
for(int i=0;i<editable.length;i++)
{
for(int j=0;j<editable[i].length;j++)
{
if(editable[i][1].equals(selection))
{
while(!editable[i-1][j].equals(selection))
{
editable= new String[i-1][j];
}
}
}
}
每次我尝试这个时,我都会得到一个Index out of bounds异常。此表用于稍后在应用程序中更新数据库的内容,因此名称需要保持相同以保持连续性。有没有人对我如何进行有任何建议?我不能使用收藏课程的任何部分,因为这是我工作场所的学术练习。
答案 0 :(得分:1)
我认为username
是您的一个表格列。
如果你想“更改”数组,即删除一个条目,就像你可能知道的那样,Java不能在不创建新数组的情况下做到这一点。有一个包含此功能的类,它叫做ArrayList
,如果你想从结果中“删除”行,你可能想要使用List<String[]>
而不是String[][]
。
如果您实际上根本不对该行感兴趣,您还可以在SQL语句中添加WHERE
子句,以防止该行首先在ResultSet
中返回。将PreparedStatement
设为"SELECT * FROM Java_Test_Profiles WHERE username NOT LIKE ?"
或WHERE
条款适用于您的情况。
如果您经常通过username
访问Java中的数据,您可能真的想要使用Map<String, String[]>
,其中值是整行,密钥是用户名。
您可以考虑使用class JavaTestProfile
(我实际上称之为数据结构,但在Java中,技术上也是类),而不是String[]
来表示行。您可能希望在持久层的帮助下自动生成该数据结构甚至相应的SQL。您可以查看 Spring 和 Hibernate 等内容。
P.S:
table
是语句的错误变量名称。 stmt
会好得多。特别是假设你有table
和dbTable
,那就更具误导性了:table
是查询,dbTable
是来自Java查询的数据。这些名字会暗示它是相反的。
rowNumb
也是一个错误的变量名称,因为它意味着行号,这通常是不明确的。更好地使用rowCount
。 columnS
的情况相同,请更好地使用columnCount
。或numberOfRows
和numberOfColumns
,但人们可以明确理解。
P.P.S .:
rowNumb() < 100
中的条件while
毫无意义,因为rowNumb
在循环期间永远不会更新。它只是防止循环完全迭代,以防查询返回100行或更多行。也许这是有意的,但是为什么一遍又一遍地检查条件而不是放在if ()
周围的while ()
中会让人感到困惑。
答案 1 :(得分:0)
经过大量编辑和&#34;黑客攻击&#34;我的代码,我提出了这个解决方案:
String[][] tempTable=null;
int newArrayLength=editable.length-1;
Scanner scnInputst = new Scanner(System.in).useDelimiter("\\n");
String selection = scnInputst.next();
tempTable = new String[newArrayLength][9];
for(int rowCounter=0;rowCounter<newArrayLength;rowCounter++)
{
if(!editable[rowCounter][1].equals(selection.trim())
{
temptable[newRows]=editable[rowCounter];
newRows++;
}
}