【问题标题】:From an ArrayList to a String [] [duplicate]从 ArrayList 到 String [] [重复]
【发布时间】:2013-09-13 00:00:25
【问题描述】:

我已经实现了一个返回 SQL 数据库查询结果的方法。 我只希望该方法只返回一个 String[],它是在数据库上选择一列的查询的结果。 这是我的代码:

public class DBConnection {
private static Connection con;
private static Statement st;
private static ResultSet rs;

    try
    {   
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://localhost:3306/database","user","password");
        st = con.createStatement();
    }

    catch (Exception ex)
    {
        System.out.println("Error: "+ex);
    }
public ArrayList<String[]> doQuery (String query)
{
      ArrayList<String[]> v = null;
      String [] record;
      int columns = 0;
      try {
         Statement stmt = con.createStatement();    
         ResultSet rs = stmt.executeQuery(query);   
         v = new ArrayList<String[]>();
         ResultSetMetaData rsmd = rs.getMetaData(); 
         columns= rsmd.getColumnCount();            

         while(rs.next()) {   
            record = new String[columns]; 
            for (int i=0; i<colonne; i++) record[i] = rs.getString(i+1); 
            v.add( (String[]) record.clone() );
         }
         rs.close();     
         stmt.close();   
      } catch (Exception e) { e.printStackTrace(); }

      return v;
   }    

此方法返回一个包含查询结果的 ArrayList 对象。 现在,问题是:我怎样才能从这个 ArrayList 对象中获得一个只包含结果列的 String[] 对象?

(作为信息:String[] 对象将被插入到 JComboBox 对象中)

【问题讨论】:

  • 先说明一下:你为什么打电话给record.clone()?无论如何,您正在创建一个新数组,clone() 只会创建另一个数组 - 它不是深度克隆,即字符串也没有被克隆(这也是不必要的)。
  • 已经回答了。检查这个stackoverflow.com/questions/5374311/…

标签: java sql arraylist


【解决方案1】:

为什么不打电话给v.toArray(new String[0])

【讨论】:

  • 谢谢,但如果我这样做并打印结果,控制台会解释:Exception in thread "main" java.lang.ArrayStoreException at java.lang.System.arraycopy(Native Method) at java.util.Arrays.copyOf(Arrays.java:2248) at java.util.ArrayList.toArray(ArrayList.java:360) at Main.main(Main.java:20)
  • 您的数组中是否包含整数?如果是这样,那么您将获得该异常
  • 问题是v是一个字符串数组列表,上面的建议会尝试将String[]转换为String[]。虽然未经测试的v.toArray(new String[0][]) 可能会起作用。
【解决方案2】:

粘贴链接Converting 'ArrayList<String> to 'String[]' in Java中给出的解决方案

ArrayList<String> list = new ArrayList<String>();
String[] array = list.toArray(new String[list.size()]);

(或)

ArrayList<String> arrayList = new ArrayList<String>(); 
Object[] ObjectList = arrayList.toArray();
String[] StringArray = Arrays.copyof(ObjectList,ObjectList.length,String[].class);

【讨论】:

    【解决方案3】:

    我假设你的问题有两个组成部分:a)你想返回一个字符串数组,b)你想只返回一个列。

    a) 的答案已经给出或至少暗示过。
    b) 的答案要求您知道要返回或调整查询的列的名称。

    你可以把你的方法改成这样:

    public String[] doQuery (String query, String columnName) //columnName not needed if you know the index of the column or if the name is always the same, in which case it could be some constant
    {
      List<String> v = new ArrayList<String>();
    
      try {
         Statement stmt = con.createStatement();    
         ResultSet rs = stmt.executeQuery(query);           
    
         while(rs.next()) {    
            v.add( rs.getString(columnName) ); //or rs.getString(1); if you know the column is the first in the query's result
         }
         rs.close();     
         stmt.close();   
      } catch (Exception e) { e.printStackTrace(); }
    
      return v.toArray(new String[v.size()]); 
    }    
    

    一些注意事项:

    • 您必须确保该列具有您要查询的名称,即您不能先调用select columnA from ...,然后再调用rs.getString("columnB");。如果您不知道名称但知道结果集中列的索引,请改用rs.getString(x);,其中x 是从一开始的索引。

    • 您也可以使用v.toArray(new String[0]); 代替v.toArray(new String[v.size()]);。两者的区别在于前者返回作为参数传递的数组,而后者在内部创建一个新数组并返回。

    【讨论】:

    • 首先感谢您的回答。您使用 List&lt;String&gt; v = new ArrayList&lt;String&gt;(); 为什么使用 List 而不是 ArrayList?想得更好,我发现我可以在查询本身中插入 columnName.. 你觉得呢?
    • 首先,通常最好针对接口而不是具体实现进行编程。关于v,您只需要知道它是一个List&lt;String&gt;,如果您以后想用LinkedList&lt;String&gt; 替换ArrayList&lt;String&gt;,它只是一个必须更改的地方(真的,这在您的情况,但还有其他情况不是,尽可能使用接口只是一个好习惯;))。
    • @Bernheart 至于查询:您可以自己添加列名,前提是您知道查询是从正确的表中选择的。另一种选择可能是仅传递 where 条件并在方法中创建查询字符串。
    • 一个好的解决方案可能是将表名和列名作为字符串传递给方法。这种方式不需要编写查询,而是在方法中实现查询本身。你怎么看?顺便说一句,我谢谢你。你的方法有效。谢谢
    • @Bernheart 这可能是一个解决方案。但是请注意,您仍然必须处理列类型错误或表中不存在的情况。您可能还想考虑使用一些 ORM 库(例如 Hibernate、Eclipse Link 等)来促进数据库访问。顺便说一句,如果这是您想要的,请随时接受答案;)
    【解决方案4】:

    在 ArrayList 上,您可以调用 toArray() 来获取其值的 Array。

    看起来像这样:

    // create an ArrayList
    ArrayList<String> theArrayList = new ArrayList<String>();
    theArrayList.add("aString");
    theArrayList.add("anotherString");
    
    // get its contents as an Array
    String[] theArray = new String[theArrayList .size()];
    theArray = theArrayList.toArray(theArray);
    

    您可以在Java Docu for ArrayList.toArray() 中查找更多详细信息。

    【讨论】:

    • 我已经试过你用命令System.out.println(theArray).. 写了什么。结果是:Exception in thread "main" java.lang.ArrayStoreException at java.lang.System.arraycopy(Native Method) at java.util.ArrayList.toArray(ArrayList.java:361) at Main.main(Main.java:21)
    • 如果您在 return v; 行之前调试代码,此时您在 v 内部看到了什么?
    猜你喜欢
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 2015-08-18
    • 2019-11-28
    相关资源
    最近更新 更多