将 Java 结果集转换为字符串数组

Posted

技术标签:

【中文标题】将 Java 结果集转换为字符串数组【英文标题】:Convert Java resultset to String array 【发布时间】:2010-12-13 16:35:02 【问题描述】:

我正在编写一个程序,它将查询 MS Access 数据库,将查询作为结果集返回,然后我想最终将该结果集转换为字符串数组,以便我可以将其传递给Swing JComboBox - 所以 ComboBox 将列出查询返回的项目。

我已经能够将结果集的行存储到 ArrayList 中,然后将该 ArrayList 转换为对象数组,组合框将列出正确的项目,但作为对象。我根本无法将该 ArrayList 转换为 String 数组。有谁知道这是否可能?这是我的一些代码...

// Convert the Resultset into an array list

public ArrayList<ArrayList<Object>> Results2Array(ResultSet rs) throws SQLException 
    ResultSetMetaData metaData = rs.getMetaData();
    int columns = metaData.getColumnCount();

    ArrayList<ArrayList<Object>> al = new ArrayList<ArrayList<Object>>();

    while (rs.next()) 
        ArrayList<Object> record = new ArrayList<Object>();

        for (int i = 1; i <= columns; i++) 
            Object value = rs.getObject(i);
            record.add(value);
        
        al.add(record);
    
    return al;


// Convert ArrayList to Object Array, and pass into GUI

ArrayList<String> Locations = new ArrayList<String>();
ArrayList<String> Months = new ArrayList<String>();
ArrayList<String> Years = new ArrayList<String>();

try 
    DB.loadDriver();
    DB.makeConnection();
    DB.buildStatement();

    Locations = DB.getLocations();
    Months = DB.getMonths();
    Years = DB.getYears();

    Object[] arrLocations = Locations.toArray();
    Object[] arrMonths = Months.toArray();
    Object[] arrYears = Years.toArray();

    dbGUI ui = new dbGUI(arrLocations, arrMonths, arrYears);
    ui.setVisible(true);

任何人都可以提供任何建议吗?谢谢!


更新:

这是我收到的堆栈跟踪:

java.lang.ArrayStoreException
    at java.lang.System.arraycopy(Native Method)
    at java.util.Arrays.copyOf(Unknown Source)
    at java.util.ArrayList.toArray(Unknown Source)
    at kidsfirstdb.Main.main(Main.java:23)

【问题讨论】:

【参考方案1】:

String[] arrLocations = locations.toArray(new String[0]);

上面的代码会将字符串列表转换为字符串数组。现在,在您的情况下,您正在创建对象列表,因此您不能直接将其转换为字符串数组。一般有两种选择:

    最初将您的列表定义为字符串列表,并在填充列表时将您的值转换为字符串(以太通过执行 Object#toString 或提取/生成有意义的字符串值)并将其存储到您的列表中,例如在您的代码中执行此操作 String value = rs.getObject(i).toString(); 如果您没有在第 1 步中执行此操作,那么您将必须分配一个字符串数组,循环遍历您的列表,将当前值转换为字符串并将其粘贴到数组中。我会选择选项 1。

顺便说一句 - Java 中的方法应该以小写字母开头

【讨论】:

我之前尝试过,它给了我一个:java.lang.System.arraycopy(Native Method) at java.util.Arrays.copyOf(Unknown Source) at java.lang.ArrayStoreException java.util.ArrayList.toArray(Unknown Source) at kidsfirstdb.Main.main(Main.java:23) 干得好 DroidIn。但事实是,返回的 List 是 List 的 List。即使我们使用 toString() 或 rs.getString()。它不适用于该方法返回的 List。 这是概念性的。这个想法是 - 如果你需要橙子,不要从苹果开始 我百分之百同意。但人们必须知道苹果和橘子。而且他似乎没有意识到这一点,因此他得到了异常,他无法找出原因。【参考方案2】:
   String[] arrLocations = locations.toArray(new String[0]);

是正确答案。您例外的原因是所有对象实际上都不是字符串。

你需要改变这个:

   Object value = rs.getObject(i);

到这里:

   String value = rs.getString(i);

或者这个:

   String value = rs.getObject(i).toString();

如果您可以返回空列,则最后一个将需要空检查。

请注意,toString() 表示可能并非在所有情况下都完全符合您的要求,但它可以帮助您入门。

编辑:如果您要填充组合框,您将需要每行一列,不是吗?如果不是,您需要以某种方式将整行表示为字符串。然后将其放入值中,并将值直接放入最终的数组列表中,因此您的循环需要如下所示:

    ArrayList<String> al = new ArrayList<String>();
    while (rs.next()) 
            ArrayList<String> record = new ArrayList<String>();
            for (int i = 1; i <= columns; i++) 
                    String value = rs.String(i);
                    record.add(value);
            
            String value = methodWhichConvertsArrayListToStringTheWayYouNeedItFormatted(record);
            al.add(value);
            
    return al;

【讨论】:

感谢您的帮助。我尝试了您的建议,但我似乎仍然在 String[] arrLocations = locations.toArray(new String[0]); 因为你返回的ArrayList,不是String的列表,而是ArrayList的列表,ArrayList终于有了字符串。 我已经修改了我的帖子以包含一些代码,这可能会对您有所帮助。干杯。【参考方案3】:

为什么不使用 rs.getString()。我不建议这样做。但它会解决你的问题。我的意思是从一开始就处理字符串。例如,

// Not a good idea to pass a active resultset as a parameter. 
// Use disconnected implementation instead, for example rowset.
public ArrayList<ArrayList<Object>> results2Array(ResultSet rs)
            throws SQLException 
    ResultSetMetaData metaData = rs.getMetaData();
    int columns = metaData.getColumnCount();

    ArrayList<String[]> list = new ArrayList<String[]>();

    while (rs.next()) 
            String[] record = new String[columns];

            for (int i = 1; i <= columns; i++) 
                    // Not a good idea to get everything as a string. This way you will
                    // get a default string representation of objects. Suppose, you 
                    // want to format dates and doubles as per some requirement.
                    record[i-1] = rs.getString(i);
            
            list.add(record);
    
    return list;

现在你需要像下面这样得到它。

String[][] arrLocations = locations.toArray(new String[locations.size()][0]);

最好还是检查类型并使用您拥有的元数据适当地获取值。这将帮助您格式化数据,即日期和双精度数。

【讨论】:

以上是关于将 Java 结果集转换为字符串数组的主要内容,如果未能解决你的问题,请参考以下文章

将 SQL 查询结果转换为字符串数组

如何在Apache Spark Java中将数组类型的数据集转换为字符串类型

如何将包含字符串列表的 numpy 数组转换为包含零和一列表的数组?

java中如何将字符数组转换成字符串,以逗号分割

Python中字符串与数组的转换方法

在 Java 中,如何将字节数组转换为十六进制数字字符串,同时保持前导零? [复制]