【问题标题】:Storing elements into an ArrayList but getting redundancies?将元素存储到 ArrayList 但会出现冗余?
【发布时间】:2013-08-06 01:29:32
【问题描述】:

我编辑了问题: 我正在尝试将数据库所有表的外键存储在 arraylist Fkeys 中。我有方法 getFK 检索现有表的外键(如果存在)

public ArrayList Fkeys = new ArrayList();
public ArrayList Vec = new ArrayList();

public ArrayList getFK () {
    try {

        /* Database connection */

       DBConnection connect = new DBConnection();
       connect.DBConnect();
       Connection con = connect.con;
       /* Getting some infos regarding keys*/
       DatabaseMetaData metadata = con.getMetaData();
       ResultSet clefs = metadata.getImportedKeys(null, null, "persons");

while(clefs.next()) {
    Vec.add(clefs.getString("FKCOLUMN_NAME"));
                   }
    Fkeys.add(Vec);


    clefs = metadata.getImportedKeys(null, null, "departments");

while(clefs.next()) {
    Vec.add(clefs.getString("FKCOLUMN_NAME"));
                   }
    Fkeys.add(Vec);
}

现在,当我执行此操作时,我得到以下结果:[[ ], [ ]],因为两个表 person 和部门没有外键。 但是当我将这些行添加到有关具有 3 个外键的学生表的方法中时

clefs = metadata.getImportedKeys(null, null, "students");

while(clefs.next()) {
    Vec.add(clefs.getString("FKCOLUMN_NAME"));
                   }
    Fkeys.add(Vec);

我得到这个结果: [[id, person, depp], [id, person, depp], [id, person, depp]] 虽然它应该是: [[id,人,德普],[],[]] 我做错了什么?为什么Vec的内容存储在Fkeys的所有位置?

【问题讨论】:

  • 谱号在哪里声明,在哪里填充?
  • 很明显,这不是真正的代码,并且严重怀疑它与真实代码的匹配程度足以进行适当的分析。请提供真实的 SSCCE。
  • 您似乎在每次调用 getFK 时都返回了相同的 ArrayList 实例(它在方法之外声明为常规类成员)。使数组列表成为getFK 的适当局部变量。
  • 现在编辑的都是同一个方法,但我还是不明白出了什么问题。

标签: java arraylist storage redundancy


【解决方案1】:

这个循环似乎每次都向alist添加相同的东西......

    while(keys.next()) {
          alist.add(clefs.getString("FKCOLUMN_NAME"));  
    }

我不能确定这就是问题所在(因为你没有告诉我们clefs 是什么!)...但我觉得这很可疑。

【讨论】:

  • 抱歉谱号是用来作为结果集的键
  • 当我用没有外键的表显示 alist 的内容时,它给了我一个空数组结果,所以它可能正常工作我真的找不到问题出在哪里
  • 所以你说的是这不是你展示给我们的实际代码。我认为尝试诊断不是真实代码的代码没有多大意义。请提供适当的 SSCCE。
  • 这是我再次编辑为正确形式的真实代码,这只是我第一次编辑时的错误,因为这是我第一次在这里发布问题。很抱歉给您带来不便。
  • 尽管如此,请提供适当的 SCCEE。
【解决方案2】:

查看Sets,它们类似于列表,但它们具有在对象内部唯一的能力。 IE。如果你有:

Set<Integer> intSet = new HashSet<Integer>()
intSet.add(1);
intSet.add(1);
for (Integer i : intSet) {
     System.out.println(i);
}

最终的输出应该是:

1

集合不允许同一集合中有多个相同的对象。

另外,当你声明你的 ArrayLists 时,一定要注意每个是什么类型的 ArrayList,否则你的 IDE 应该对你大喊大叫,但我认为它默认为 Object。如果您需要 Set/List 中的 3 个字段,我建议您使用自定义模型对象,并像这样声明它List&lt;CustomModelObject&gt; listOfObjects = new ArrayList&lt;CustomModelObject&gt;();(如果您需要 Set 示例,请参见上面的示例)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    相关资源
    最近更新 更多