【问题标题】:Unable to print an ArrayList无法打印 ArrayList
【发布时间】:2017-06-11 20:12:38
【问题描述】:

我有一些从数据库中提取数据集的代码。我可以 Println 每个元素,所以我知道它可以从数据库中出来。

如果我这样做:

  public ArrayList<String[]> selectsingle(String query) throws SQLException{
    ArrayList <String[]> result = new ArrayList<String[]>();
    connect();
    stat = con.createStatement();
    ResultSet rs = stat.executeQuery(query);
    int columnCount = rs.getMetaData().getColumnCount();
    while(rs.next()){
      String[] row = new String[columnCount];
      for (int i=0; i <columnCount ; i++){
        row[i] = rs.getString(i + 1);
        System.out.println(row[i]);    
      }
      result.add(row);
      System.out.println(Arrays.toString(row));
    }
    disconnect();
    return result;

  }   

然后最后的println 给了我我的数组和每个元素。

当我想将数组传回调用函数时,问题就来了,我只得到内存位置,我根本无法println 元素。我一生都无法弄清楚我哪里出错了,因为它似乎是结果。添加让我失望!

调用这个的代码:

 private void TableCustMouseClicked(java.awt.event.MouseEvent evt) {                                       
    try {
        ArrayList<String[]> result = new ArrayList<String[]>();
        result = db.selectsingle("SELECT * FROM CUSTOMER WHERE ID = " + TableCust.getValueAt(TableCust.getSelectedRow(), 0));
        System.out.println(result.toArray());
    } catch (SQLException ex) {
        Logger.getLogger(panelCustMain.class.getName()).log(Level.SEVERE, null, ex);
    }

无论我如何处理结果,我总是得到这个:

3 - 元素
先生-元素
抢 - 元素
人 - 元素
[3, Mr, Rob, Man] - println(row)(如预期)
[Ljava.lang.Object;@502f737f - 添加行并返回结果数组后的 println(result.toArray())。

【问题讨论】:

  • 你能告诉我们据称没有正确打印元素的代码吗?
  • “我只获取内存位置”,这表明您可能会看到Type@hexHashCode,但这很奇怪,因为您在代码中使用了Arrays.toString(row);,这表明您已经意识到了这个问题。那么为什么不再使用Arrays.toString(row); 呢?
  • "当我想将数组传递回调用函数时" 你的意思是在selectsingle 的调用者中,在你没有显示的代码中,你有打印返回的ArrayList&lt;String[]&gt; 时遇到问题?如果是这样,为什么这会让您感到困惑,因为您似乎已经知道需要使用 Arrays.toString() 才能正确打印数组?
  • 这不是内存位置,而是哈希码,但请在问题中包含输出以使其更清楚
  • @Ypsilon 不要(尝试)在评论中发布代码。删除该评论,并编辑问题以澄清它。

标签: java arraylist


【解决方案1】:

就像您在 String[] 数组上使用“Arrays.toString()”一样,在 foreach 中使用它:

result.forEach(strArray -> System.out.println(Arrays.toString(strArray)));

解释是:

对持有对象引用的变量执行“System.out.println()”方法,实际上是在后台调用对象的 toString() 方法。

在您的示例中 String[] 数组是您的对象,但它的 toString() 方法没有被覆盖,而是从 Object 类继承(因为 java 中的所有数组都不会覆盖它),因此 Object 的 toString() 是调用它打印类全名 + @ + 哈希码结果。在您的示例 String[] 数组的 toString() 打印是 --> "[Ljava.lang.Object;@502f737f"。打印“Object”类是因为您使用了“result.toArray()”,它刚刚创建了对象数组(同样的问题)。

内部方法成功打印结果的唯一原因是因为您正在调用 Arrays.toString(),它迭代并调用数组对象的 toString() 方法并最终返回它们的字符串表示形式。

所以在外部调用方法中也可以使用它。

关于String[]更完整的解释(不想重复,见“数组类型的成员”),-->https://stackoverflow.com/a/13780418/992200

顺便说一句,建议的答案是从 ArrayList 中的不同行打印每个数组,您可以使用高效的 StringBuilder\StringBuffer\StringJoiner 在同一行打印它(选择您需要的那个)。

【讨论】:

  • 这很奏效,非常感谢。只有一个问题,我实际上不想打印,我想将每个元素添加到一个变量中,以在 Textbox 上设置文本....?
  • 是否要将每个 String[] 行数组添加到文本框?如果是,那么只需修改我的示例中的内部 lambda,您可以用您希望的任何代码替换打印,对于多行代码,用“{ }”将其包装:例如:'result.forEach(strArray -> { System.out. println(Arrays.toString(strArray))); //添加您的代码... }' 顺便说一句,请使用 StringBuilder\StringBuffer\StringJoiner 之一以提高效率。
【解决方案2】:

您应该遍历此数组列表以打印每一行:

result = db.selectsingle("SELECT * FROM CUSTOMER WHERE ID = " + TableCust.getValueAt(TableCust.getSelectedRow(), 0));
for(int i= 0;i<result.size();i++)
  System.out.println(result.get(i));

【讨论】:

  • 使用了那个确切的代码(和类似的,我尝试了 forEach 方法),我得到的结果是:[Ljava.lang.String;@212538cd 仍然无法让它工作!
  • @Rosário Pereira Fernandes: System.out.println(result.get(i)); 调用 String[] 对象的 toString 方法 --> 调用 Object 的默认方法,请看我的回答 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 2016-10-18
  • 2012-10-14
  • 2013-04-30
相关资源
最近更新 更多