【问题标题】:Populating Java multidimensional arrays填充 Java 多维数组
【发布时间】:2016-09-14 14:07:00
【问题描述】:

我是 Java 新手,我试图完成的示例是 ColdFusion 结构。以如下数据结构为例。

 id     color
 50     blue
 60     red
 70     green
 80     yellow

我想从如下所示的查询结果集创建一个 Java 多维数组。

 1 id    50
   color blue
 2 id    60
   color red
 3 id    70
   color green
 4 id    80
   color yellow

我的目标是使用返回的数组来用数据填充 JSP 页面。我试图让我的代码适应查询返回的不同数量的行。我目前的代码如下。

 private static String[][][] query(Connection connection) throws SQLException{

      Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
      ResultSet resultSet = statement.executeQuery("SELECT colors.id,colors.color FROM colors");
      int size;
      resultSet.last();
      size = resultSet.getRow();
      resultSet.beforeFirst();

      ResultSetMetaData rsltmetadata = resultSet.getMetaData();
      int colCount = rsltmetadata.getColumnCount();

      String[][][] rlstSetArray = new String[size][colCount][];

      int m = 0;
      while(resultSet.next()) {
           ++m; 
           for (int j=1; j <= colCount; j++){
                System.out.println(m);
                System.out.println(rsltmetadata.getColumnName(j));
                System.out.println(resultSet.getString(rsltmetadata.getColumnName(j)));

           }
       }
 }

这段代码产生这个输出。

 1
 id
 50
 1
 color
 blue
 2
 id
 60
 2
 color
 red

等等……

代替三个 System.out.println 行已尝试以下选项并从 NetBeans 8.1 收到相同的消息。 '不兼容的类型:字符串不能转换为int'

 rlstSetArray[m][rsltmetadata.getColumnName(j)] = resultSet.getString(rsltmetadata.getColumnName(j));

 rlstSetArray[m][rsltmetadata.getColumnName(j)] = "'" + resultSet.getString(rsltmetadata.getColumnName(j)) + "'";

 rlstSetArray[m]["'" + rsltmetadata.getColumnName(j) + "'"] = resultSet.getString(rsltmetadata.getColumnName(j));

是什么导致了这条消息?

这是否允许我使用数组第二维中的列名从 JSP 中的数组中检索数据?

【问题讨论】:

  • (编辑)该错误是因为您将数组用作结构。数组必须由索引number 引用,即像这样[0][1] 而不是[0]["columnName"]。另外,不要忘记 java 数组是从 0 开始的,而不是从 1 开始的。 (旁注,与您的问题无关,但不要忘记在完成后关闭所有语句、结果集、连接等以防止内存泄漏)。
  • 谢谢,这对我和其他 cmets 都有帮助。一旦我让它工作,我会回来检查适合我的答案。

标签: java arrays jsp coldfusion


【解决方案1】:

为您的结果集创建 POJO 包装类而不是 3 维数组怎么样?

public class Color {
    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

那么查询方法可以简化:

private static List<Color> query(Connection connection) throws SQLException{
    List<Color> colors = new LinkedList();
    ...
    while(resultSet.next()) {
        Color color = new Color();
        color.setName(resultSet.getString(rsltmetadata.getColumnName("color"));
        color.setId(resultSet.getString(rsltmetadata.getColumnName("id"));
        colors.add(color);
    }
    return colors;
}

【讨论】:

  • 我使用了这个选项,因为对 Java 新手来说它对我来说更有意义。谢谢大卫。
【解决方案2】:

我不知道我是在回答你的问题,但是当我看到三重维度时,我听到了“哎哟”的声音:

private static String[][][] query(Connection connection) throws SQLException{

您是否考虑过对数据使用 POJO?

class ColorMap {
     private final Integer id;
     private final String  color;

     private static HashMap<String, Integer> nameMap = new HashMap<String, Integer>();

     public ColorMap(int theId, String theColor) {
         id = theId;
         color = theColor;
         addColorToMap();
     }

     private void addColorToMap() {
         ColorMap.nameMap.put(this.color, this.id);
     }

     public static Integer getColorByName(String theName) {
         return ColorMap.nameMap.get(theName);
     }
}

然后,您将在从查询中提取数据时填充地图,我将使用列名来查找它们的值,否则它们将与查询文本紧密耦合。

【讨论】:

  • 作为 Java 新手,有很多我不知道的地方。我正在寻找使用我的 PHP 和 ColdFusion 知识作为起点来完成被认为是最佳实践的任务的方法。感谢您的建议,我会进一步研究如何使用它。
  • 如果你仔细想想,它与你在 CF 中所做的并没有太大的不同。多维数组在任何语言中都不是很直观。因此,通常您会将数据打包成更直观的格式,例如 CFC(甚至是“结构”)。 POJO 使用相同的概念。
猜你喜欢
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
相关资源
最近更新 更多