关于java:从ArrayList到String []

From an ArrayList to a String []

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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[]对象?

(作为信息:字符串[]对象将插入JComboBox对象中)


我假设您的问题有两个组件:a)您想要返回一个字符串数组,b)您想要只返回一个列。

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

您可以将方法更改为如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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()]);。两者的区别在于前者返回作为参数传递的数组,而后者在内部创建一个新数组并返回该数组。


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


在ArrayList上,可以调用ToArray()以获取其值的数组。

如下所示:

1
2
3
4
5
6
7
8
// 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中查找更多关于ArayList.toAlay.()的详细信息。


将Java中的链接转换"AlrayList< String"给出的解决方案粘贴到"String"中

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

(或)

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