字符串数组列表覆盖自身
这里有第一个问题,完整的新手,所以尽量放轻松。 我想弄清楚这里有什么问题:
public List idOnlyQuery(String searchTerm, Connection conn){ List result = new ArrayList(); String[] rowResult = new String[7]; Statement stmt = null; try { stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery( "SELECT * FROM Jets WHERE CurrentID LIKE '" + searchTerm + "%'"); while(rs.next()){ String currentId= rs.getString("CurrentId"); String manufacturer = rs.getString("Constructor"); String type = rs.getString("ACType"); String series = rs.getString("Series"); String index = rs.getString("KeyNo"); String operator = rs.getString("Operator"); String baseAirport = rs.getString("Home_Airfield"); rowResult[0] = (currentId); rowResult[1] = (manufacturer); rowResult[2] = (type); rowResult[3] = (series); rowResult[4] = (operator); rowResult[5] = (baseAirport); rowResult[6]= (index); result.add(rowResult); } System.out.println(result.get(0)[0]);
此方法返回字符串数组列表,这些数组是从SQLite数据库中检索的。 除了我的结果List
中的字符串数组似乎每次while循环重复时都被覆盖的事实之外,一切都有效。 最后一个println
总是给我从数据库中检索的最后一行的currentId
,但是如果我在while
循环中放入一个println
while
它会在每个循环中返回相应的数据。 我真的无法弄清楚我的String[]
元素被覆盖的位置。 它可能非常明显,但我花了几个小时在网上查看我是否正确地进行了添加程序,但仍然没有快乐。 帮帮我!
您需要在循环中创建rowResult
数组。 您的列表只包含指向数组的指针,您基本上只使用一个实例。
在使用rowResult = new String[7];
每次初始化之前。
这是因为,数组是Java中的对象,所以基本上你一次又一次地改变同一个对象的值。
这是因为你要重新分配数组位置:
rowResult[0] = (currentId); rowResult[1] = (manufacturer); rowResult[2] = (type); rowResult[3] = (series); rowResult[4] = (operator); rowResult[5] = (baseAirport); rowResult[6]= (index);
在while循环中创建一个临时String
数组,并将其添加到result
:
while (rs.next()) { String[] rowResult = new String[7]; .. // do your stuff result.add(rowResult); }
每次while
循环执行时,它都会将其添加到result
,然后重新开始。
您对所有行使用相同的rowResult数组。 放线
String[] rowResult = new String[7];
在while循环中,一切都会正常工作。
您正在覆盖rowResult对象。 您必须创建一个新的,填充它并在每次迭代时将其添加到列表中。 你做的就像拿一个篮子,把它装满橙子并放在架子上,然后取出同样的篮子,把橘子扔出来放入新的。
public List idOnlyQuery(String searchTerm, Connection conn){ List result = new ArrayList(); Statement stmt = null; try { stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery( "SELECT * FROM Jets WHERE CurrentID LIKE '" + searchTerm + "%'"); while(rs.next()){ String[] rowResult = new String[7]; rowResult[0] = rs.getString("CurrentId"); rowResult[1] = rs.getString("Constructor"); rowResult[2] = rs.getString("ACType"); rowResult[3] = rs.getString("Series"); rowResult[4] = rs.getString("Operator"); rowResult[5] = rs.getString("Home_Airfield"); rowResult[6] = rs.getString("KeyNo"); result.add(rowResult); } System.out.println(result.get(0)[0]); } catch (Exception e) {} }
你一遍又一遍地重写String数组。 尝试在每个循环中创建一个新数组。
List result = new ArrayList(); String[] rowResult; Statement stmt = null; try { stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery( "SELECT * FROM Jets WHERE CurrentID LIKE '" + searchTerm + "%'"); while(rs.next()){ rowResult = new String[7]; //Create a new object String currentId= rs.getString("CurrentId"); //... }
这是因为当你这样做时:
rowResult = new String[7]; //Create a new object
此变量指向内存中的对象:
rowResult -------------> new String[7]
因此,如果我循环遍历结果集并使用rowResult进行编写,我确实只修改了一个对象(通过每次添加它到列表中,您只有很多变量指向同一个对象):
result.get(0) -------------->| result.get(1)--------------->| String[7] result.get(n)--------------->|
当通过new运算符创建循环中的新数组时,您确实有一个新的新对象可以使用:
result.get(0) -------------->| String[7] result.get(1)--------------->| String[7] result.get(n)--------------->| String[7]