【问题标题】:Array list prints same data for all elements数组列表为所有元素打印相同的数据
【发布时间】:2012-11-08 01:51:04
【问题描述】:

我正在尝试打印提取并存储在对象中的数据集。该对象使用一个数组列表。在获取数据时(在将其添加到数组列表之前),所有记录都打印不同,但是当我打印它们时,它们是相同的。我不知道为什么。

这里是代码

void caseClicked()

{
  //println("Inside case clicked");

  for(int i = 0; i < mapData.size(); i++)
  {
    if (dist(mapData.get(i).pf.x, mapData.get(i).pf.y, gX, gY) < percentY(1))
    {
      clickedCaseId = mapData.get(i).icaseNum;
      clickedStateId = mapData.get(i).stateId;
      glyphPosX = mapData.get(i).pf.x;
      glyphPosY = mapData.get(i).pf.y;
      print("Value of icaseNum selected" + mapData.get(i).icaseNum + "\n");
      break;
    }
    else
      continue;
  }

  try{
          db.getConnection(); 
          if (db.conn.connect())
          {
            String tempQ = "select distinct(svin), vfatcount, saccdate, day " + d_year + " where icasenum = " + clickedCaseId + " and istatenum = " + clickedStateId;
            println(tempQ);
            db.conn.query(tempQ);
            Glyph tg1 = new Glyph();                 
            gl.fnVins.clear();
            while (db.conn.next()) 
            {
              tg1.fVin.VIN = db.conn.getString(1);
              tg1.fVin.fatals = (int)Float.parseFloat(db.conn.getString(2));
              println("Value of VIN is " + tg1.fVin.VIN + "\n");
              println("Value of fatals is " + tg1.fVin.fatals + "\n");

              gl.fnVins.add(tg1.fVin);
              gl.gdate = db.conn.getString(3);
              gl.gday = db.conn.getString(4);
            }

            for (int i = 0; i < gl.fnVins.size(); i++)
            println("Value of VIN is " + gl.fnVins.get(i).VIN + "\n");

          }
      }
      catch (Exception e)
      {      
          System.err.println ("Error:DBHelper.dataPointQuery - " + e.toString());
       //   return null;        
      }          
            db.closeConnection();


}

字形类是

public class Glyph
{
  float caseNum = 0;
  float stateId = 0;
  float time = 0;
  int fatal = 0;
  String gday = "", gdate = "";

  class fnVin
  {
    int fatals = 0;
    String VIN = "";
  }

  fnVin fVin = new fnVin();
  ArrayList<fnVin> fnVins = new ArrayList<fnVin>();

}

请有人帮我弄清楚这个实现有什么问题吗? 提前致谢。

【问题讨论】:

  • 能否也放样输出
  • 这是示例输出(添加了一些 cmets) 查询:select distinct(svin), vfatcount, saccdate, day from year_2001 where icasenum = 60.0 and istatenum = 27.0 VIN 的值为 -1致命是 -1 VIN 的值是 1HGCB7651NA0 致命的值是 0 VIN 的值是 1HGCB7651NA0 VIN 的值是 1HGCB7651NA0。对不起格式。它不会让我在这里格式化文本。
  • 没关系,我想通了,见下文

标签: java arraylist


【解决方案1】:

问题是:在 while 循环中将它添加到 gl.fnVins 之前,您没有创建新的 tg1.fVin 实例。

gl.fnVins.add(tg1.fVin);

要解决这个问题,您必须在 while 循环中添加到数组之前创建新的 fnVin 实例。

while (db.conn.next()) {
    fVin fv = new fVin();
    fv.VIN = db.conn.getString(1);
    fv.fatals = (int)Float.parseFloat(db.conn.getString(2));              

    gl.fnVins.add(fv);
}

【讨论】:

  • 这会引发错误,因为 tg1 是 Glyph 类的对象。关于实例化 fVin 的观点。这不是在创建任何 Glyph 实例后就完成了吗?
  • 由于 fVin 类是内部类而发生错误。要解决这个问题,您可以创建一个公开的 fVin 类,或者创建一个方法来初始化 Glyph 类中的对象。
  • tg1.fVin在Glype对象初始化的时候被初始化了,但是它只初始化了一次,这就是问题所在。
  • 酷!问题已解决,但确实给我留下了一些问题,我将阅读并澄清这些问题。非常感谢您的回复。
  • 很高兴知道这对您有帮助。如果您的问题得到解决,请注明答案。
【解决方案2】:

您在这里(在您的 Glyph 类中)继续重用相同的 fnVin 对象:

Glyph.fnVin fVin = new Glyph.fnVin();

您应该做的是,首先删除该行,然后使用这个更改后的循环:

while (db.conn.next()) 
{
    fnVin fVin = new fnVin();
    fVin.VIN = db.conn.getString(1);
    fVin.fatals = (int)Float.parseFloat(db.conn.getString(2));
    // println("Value of VIN is " + fVin.VIN + "\n");
    // println("Value of fatals is " + fVin.fatals + "\n");

    gl.fnVins.add(fVin);
    gl.gdate = db.conn.getString(3);
    gl.gday = db.conn.getString(4);
}

我不确定是否仅基于您的代码,但您可能需要考虑将 gdategday 也移动到您的 fVin 内部类。此外,您应该将fVin 设置为public class,以便您可以在此方法中创建它的新实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 2014-06-23
    相关资源
    最近更新 更多