ActionCommand和矢量

时间:2012-02-21 00:19:17

标签: java

我正在尝试检索数据库中的表列表并将它们存储在Vector中。然后我希望迭代Vector。如果Button动作命令与其中一个元素匹配(即actioncommand = dbTable),我将从代码中其他位置的所选表中检索数据。

到目前为止,我能够将一个表列表导入Vector of Vector。但是,当我执行我的if语句时,我没有得到任何结果。如果有人指导我如何解决问题,我将不胜感激。谢谢。

public void actionPerformed(ActionEvent e) {
    String actionCMD = e.getActionCommand();
    for (Iterator itr = allTables.iterator();itr.hasNext();){
        if(actionCMD.toUpperCase().equalsIgnoreCase(            
                 itr.next().toString().toUpperCase())){
            dbTable = ationCMD;
            break;
        }
    }
}

public void getDBTables(){
    try {
          DatabaseMetaData md = conn.getMetaData();
          ResultSet resultset = md.getTables(null, null, "%", null);
          this.rs = resultset;
          allTables = new Vector();
          while (rs.next()) {              
              tableList = new Vector();
              tableList.addElement(rs.getString(3));
              allTables.addElement(tableList);
          }// end while
    } catch (SQLException ex) {
          Logger.getLogger(TableModel.class.getName()).log(Level.SEVERE, null, ex);
    } finally{
         if (rs != null)  {
            try {
                rs.close();
            } catch (SQLException ex) {
                Logger.getLogger(Menu.class.getName()).log(Level.SEVERE, null, ex);
            }
         }
    }
 }

2 个答案:

答案 0 :(得分:0)

您要将Vector添加到allTables向量(而不是直接添加String),因此它总是无法进行比较。消除tableList

答案 1 :(得分:0)

除非你有特定的目的(多线程同步),否则你真的不应该在新代码中使用Vector,并且Iterator结构也不是必需的(但仍然可以使用)。您还在呼叫toUpperCase,但随后又呼叫equalsIgnoreCase

话虽如此,因为您正在通过Vector获得itr.next(),然后在其上调用toString()。这永远不会匹配。您需要遍历String中的Vector。一旦匹配

,您还需要一种方法来突破外部循环
boolean found = false;
for (Iterator itr = allTables.iterator();itr.hasNext() && !found;) {
    Vector v = itr.next();
    for (Iterator itr2 = v.iterator(); itr2.hasNext() && !found;) {    
        if(actionCMD.equalsIgnoreCase(itr2.next().toString())) {
            dbTable = ationCMD;
            found = true;
        }
    }
}

实现这一目标的现代方法是使用ArrayList<ArrayList<String>>

List<List<String>> allTables;
...
allTables = new ArrayList<ArrayList<String>>();
...
tableList = new ArrayList<String>();

你的循环看起来像:

for (List<String> tables : allTables)
{
    for (String s : tables)
    {
        if (actionCMD.equalsIgnoreCase(s)) // Why up-case? You're ignoring case
        {
            dbTable = ationCMD;
            found = true;
            break;
        }
    }
    if (found)
        break;
}

您还可以使用迭代器来消除if (found)语句,或使用List.get(index)方法使用计数器获得相同的结果。恕我直言,以上只是更容易阅读。