【问题标题】:Java "2D-array" issuesJava“二维数组”问题
【发布时间】:2011-12-08 01:40:45
【问题描述】:

我在 mySQL 服务器上有一个表,其中存储了这样的数据

Name Goal New Used Total Pace
Jill  5   6    1    7     0
Bob   5   2    3    5     0 
Ann   5   1    2    3     0

它可以有更多的东西。我需要做的是从 mySQL 服务器读取数据并将其加载到二维字符串数组中。我已经知道如何加载 sql 数据...问题是我一辈子都无法弄清楚如何将其加载到数组中。

数据加载到数组后,会被发送到一个表中进行加载查看。

所以基本上数组的输出需要是:

    Jill  5   6    1    7     0
    Bob   5   2    3    5     0 
    Ann   5   1    2    3     0

这是我的代码:

public String[][] fillInTableForStoreFromArchive(String Person, String DateTable) throws SQLException{

    stmt = con.createStatement(
            ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
    rs = stmt.executeQuery("SELECT * FROM `" +DateTable+ "` WHERE name = '" +Person+"'"); 

    int rows = 0; //column number
    int columns = 6; //row number

    rows = getAmountOfSalesPeople(DateTable).length;
    String[][] data = new String[rows][columns]; 

    String name = null;
    int goal = 0, New = 0, used = 0,total = 0,pace = 0;
    while(rs.next()){

        name =  rs.getString("Name");
        goal = rs.getInt("Goal");
        New = rs.getInt("New");
        used = rs.getInt("Used");
        // total = rs.getInt("total");
        // pace = rs.getInt("pace");

        String[] mData = { name, new Integer(goal).toString(),
            new Integer(New).toString(), new Integer(used).toString(),
            new Integer(New + used).toString(),new Integer(pace).toString() };

        for(int row = 0; row >data.length; row ++){
            data[row] = mData;
        }
    }

    for(int row = 0; row < data.length; row++){
        for(int col = 0; col <data[row].length; col++){
            System.out.print(data[row][col] + " ");
        }
        System.out.println();
    }
    return data;
}

【问题讨论】:

  • 二维数组到底有什么问题?
  • 我只是不知道如何填写..我添加了代码..这有助于解释吗?应该工作>
  • 为什么不直接使用映射到数据库表的一维对象数组?
  • 它需要是一个数组还是一个集合对象?
  • 因为我是用数据填表格的...表格需要二维数组。

标签: java for-loop nested-loops


【解决方案1】:

查看您的示例,我将假设名称是唯一的。由于您有混合类型、字符串和整数,因此您不能将它们全部放入一个数组中,除非您将整数存储为字符串。一种解决方案是创建一个包含名称及其关联数据的对象……毕竟,这是在面向对象编程中所做的事情。

除非我将数据存储在 Map 中,其中 name 是键,int 数组是值:

HashMap<String, int[]> myMap = new HashMap<String, int[]>();
String name;
int[] myData;
while(rs.next())
{
  myData = new int[5];
  name = rs.getString("Name");
  myData[0] = rs.getInt("Goal");
  myData[1] = rs.getInt("New");
  myData[2] = rs.getInt("Used");
  myData[3] = rs.getInt("total");
  myData[4] = rs.getInt("pace");
  myMap.put(name, myData);
}

然后在需要时迭代地图很简单(提示:使用Map.Entry&lt;String, int[]&gt;),例如toString()。数组没有“输出”,因此您需要使用对象或单独的方法来根据需要格式化数据。

此外,避免使用像 New 这样的变量名称...名称与关键字相同但大小写不同的名称是不好的。

【讨论】:

  • 我尽量避免使用数组。在这种情况下,描述单行的对象会更容易使用,因为哈希映射解决方案可以在不创建额外类的情况下完成任务。
【解决方案2】:

您的问题是您试图通过将行设置为其他数组来将数组行作为独立实体处理...

... 2D 数组不能在“行”级别设置 - 因为它们不是使用行级指针管理的 --- 为了设置 2D 数组行,您必须显式设置和定义行和列'for' 行中的每一列,在适当的“for”循环中。

【讨论】:

  • 在Java中,多维数组实际上是数组的数组,其中每一行都是一个独立的实体。
【解决方案3】:

拥有mdata 数组后,您希望将其用作data 中的行之一。相反,您正在使用一个循环并分配给多个位置。

您应该使用计数器来跟踪您添加了多少行,然后使用该计数器将mdata 放在正确的位置。

【讨论】:

    【解决方案4】:

    作为@Paul 解决方案的必然结果,您可以在一个类中描述您的表并通过正常的OO 原则访问它。这将完全消除对数组的需求。

    比如说:

    public class Player {
    
      private String name;
      private int goal;
      private int _new; //As @Paul pointed out you should not use reserved keywords
      private int used;
      private int total;
      private int pace;
    
      public Player(String name, int goal, int _new, int used, int total, int pace) {
            this.name = name;
            this.goal = goal;
            this._new = _new;
            this.used = used;
            this.total = total;
            this.pace = pace;
        }
    
        public String getName() {
            return name;
        }
    
        public int getGoal() {
            return goal;
        }
    
        public int get_new() {
            return _new;
        }
    
        public int getUsed() {
            return used;
        }
    
        public int getTotal() {
            return total;
        }
    
        public int getPace() {
            return pace;
        }
    }
    

    然后您的初始化循环变得更具可读性:

        List<Player> players = new ArrayList<Player>();
        while (rs.next()) {
            players.add(new Player(rs.getString("Name"), 
                                       rs.getInt("Goal"), 
                                       rs.getInt("New"), 
                                       rs.getInt("Used"), 
                                       rs.getInt("total"),  
                                       rs.getInt("pace")));
    }
    

    如果你想从你的数据中打印信息,这里的好方法是重载 Player 的 toString 或添加一个新方法,比如 dumpToString()。

    public String dumpTostring() {
        StringBuilder sb = new StringBuilder();
    
        sb.append("Player ");
        sb.append(name);
        sb.append(" Goal=");
        sb.append(goal);
        sb.append(" New=");
        sb.append(_new);
        sb.append(" Used=");
        sb.append(used);
        sb.append(" Total=");
        sb.append(total);
        sb.append(" Pace=");
        sb.append(pace);
    
        return sb.toString();
    }
    

    然后只是作为 for 循环遍历列表的每个循环的一部分调用。

    【讨论】:

      猜你喜欢
      • 2011-04-20
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多