字符串数组列表覆盖自身

时间:2014-03-04 12:58:41

标签: java arrays string

这里首先提出问题,完成新手,所以尽量放轻松。我想弄清楚这里有什么问题:

public List<String[]> idOnlyQuery(String searchTerm, Connection conn){

    List<String[]> result = new ArrayList<String[]>();
    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,但如果我在println循环中放置一个while,它会返回每个String[]的相应数据循环。我真的无法弄清楚我的{{1}}元素被覆盖的位置。这可能是显而易见的,但我花了几个小时在网上查看我是否正确地进行了添加程序,但仍然没有快乐。帮助!

6 个答案:

答案 0 :(得分:2)

您需要在循环中创建rowResult数组。你的列表只包含一个指向数组的指针,你基本上只使用一个实例。

答案 1 :(得分:1)

在初始化之前每次使用rowResult = new String[7];时。

这是因为,数组是Java中的对象,所以基本上你一次又一次地改变同一个对象的值。

答案 2 :(得分:0)

这是因为你要重新分配数组位置:

  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,您将重新开始。

答案 3 :(得分:0)

您正在覆盖rowResult对象。您必须创建一个新的,填充它并在每次迭代时将其添加到列表中。你做的就像拿一个篮子,把它装满橙子并把它放在架子上,然后取出同样的篮子,把橘子扔出来放入新的。

public List<String[]> idOnlyQuery(String searchTerm, Connection conn){

    List<String[]> result = new ArrayList<String[]>();

    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) {}
}

答案 4 :(得分:0)

您对所有行使用相同的rowResult数组。放行

String[] rowResult = new String[7];

在while循环中,一切都会正常工作。

答案 5 :(得分:0)

你一遍又一遍地重写String数组。尝试在每个循环中创建一个新数组。

List<String[]> result = new ArrayList<String[]>();
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]