Java“2D阵列”问题

时间:2011-12-08 01:40:46

标签: java for-loop nested-loops

我在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服务器读取数据并将其加载到2D String数组中。我已经知道如何加载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;
}

4 个答案:

答案 0 :(得分:1)

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

除非我将数据存储在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<String, int[]>),例如在toString()中,迭代地图是微不足道的。数组没有“输出”,因此您需要使用对象或单独的方法来根据需要格式化数据。

另外,请避免使用像New这样的变量名称......没有任何好处可以出现与关键字相同但名称大写不同的名称。

答案 1 :(得分:0)

您的问题是您尝试将数组行作为独立实体处理,方法是设置其他数组的行...

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

作为@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")));
}

如果你想从你的数据良好的方法打印信息,这里将重载播放器的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();
}

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