Проблемы с Java "2D-массивом" - PullRequest
0 голосов
/ 08 декабря 2011

У меня есть таблица на сервере 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;
}

Ответы [ 4 ]

1 голос
/ 08 декабря 2011

Глядя на ваш пример, я сделаю предположение, что имя уникально.Поскольку у вас есть смешанные типы, строки и целые числа, вы не можете поместить их все в один массив, если не сохраните целые числа как строки.Одним из решений было бы создание объекта, который содержит имя и связанные с ним данные ... это, в конце концов, то, что каждый делает в объектно-ориентированном программировании.

За исключением того, что я буду хранить данные на карте,где имя - это ключ, а массив 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 ... ничего хорошего не получитсяимен, которые совпадают с ключевыми словами, но по-разному пишутся с заглавной буквы.

0 голосов
/ 08 декабря 2011

Как следствие решения @ Paul, вы можете описать свою таблицу в классе и получить к ней доступ по обычному принципу ОО. Это полностью исключило бы необходимость использования массивов.

Скажите, например:

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 Player или добавить новый метод, скажем 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();
}

, а затем просто вызывать как часть a для каждого цикла, повторяющего список.

0 голосов
/ 08 декабря 2011

Если у вас есть массив mdata, вы хотите использовать его в качестве одной из строк в data.Вместо этого вы используете цикл и присваиваете несколько позиций.

Вы должны использовать счетчик, чтобы отслеживать, сколько строк вы добавили, а затем использовать этот счетчик, чтобы поставить mdata в правильное положение.

0 голосов
/ 08 декабря 2011

Ваша проблема в том, что вы пытаетесь работать со строками массива как с независимыми объектами, устанавливая строку для другого массива ...

... 2D-массивы нельзя установить на уровне "строк" - потому чтоони не управляются с помощью указателей на уровне строк - чтобы установить строку 2D-массива, необходимо явно задать и определить строку и столбец «для» каждого столбца в строке в правильном цикле «для».

...