【问题标题】:List of String Arrays overwriting itself覆盖自身的字符串数组列表
【发布时间】:2014-03-04 12:58:40
【问题描述】:

这里的第一个问题,完整的新手,所以尽量放轻松。我试图找出这里出了什么问题:

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,但是如果我在while 循环中放置println,它会在每个while 循环中返回适当的数据。我真的不知道我的String[] 元素在哪里被覆盖。这可能真的很明显,但我花了几个小时在网上查看我是否正确地执行了添加过程,但仍然没有乐趣。帮助!

【问题讨论】:

  • @Batty 你先生,太棒了,它有效!如果您不介意对此进行扩展,那为什么需要这条线?
  • 这是必要的,因为你需要在写入信息之前初始化一个新数组。您只需覆盖当前数组而不进行初始化。
  • 谢谢大家!现在有道理了!我有很多东西要学……你们都让我头疼不已!谢谢!
  • 接受一个答案然后;)

标签: java arrays string


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这是因为您正在重新分配数组位置:

        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,然后你将重新开始。

      【讨论】:

        【解决方案4】:

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

        String[] rowResult = new String[7];
        

        在 while 循环中,一切都会正常运行。

        【讨论】:

          【解决方案5】:

          您正在覆盖您的 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) {}
          }
          

          【讨论】:

            【解决方案6】:

            您一次又一次地覆盖字符串数组。尝试在每个循环中创建一个新数组。

            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]
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-10-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多