Перебор значений в HashMap, хранящемся в ArrayList - PullRequest
0 голосов
/ 10 сентября 2018

Немного вопросов новичка, но ...

У меня есть объект ResultSet, который я возвращаю из базы данных - 3 столбца по 30 строк.

Я получаю следующий набор данных:

enter image description here

, используя следующее:

   try {
        preparedStatement = conn.prepareStatement(
                sqlStatement,
                ResultSet.TYPE_SCROLL_INSENSITIVE,
                ResultSet.CONCUR_READ_ONLY);

        rs = preparedStatement.executeQuery();

        ResultSetMetaData md = rs.getMetaData();
        int columns = md.getColumnCount();

        while(rs.next()) {
            HashMap row = new HashMap(columns);
            for(int i=1; i<=columns; ++i){
                row.put(md.getColumnName(i),rs.getObject(i));
            }
            list.add(row);
        }

... иЯ возвращаю его как ArrayList

enter image description here

..., который при отладке отображается следующим образом:

enter image description here

Я хочу иметь возможность перебирать значения HashMap в псевдокоде:

  1. получить ключ 0
  2. получить значение 0, 1 &2
  3. используйте их в качестве тестовых данных
  4. если не повезет, попробуйте ключ 2

Это не должно быть сложно, я знаю, я просто пытаюсь найтилучший способ перебора ArrayList из HashMaps

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Вы используете необработанные типы, и ваша IDE или компилятор выдают вам массу предупреждений об этом. Вы должны обратить на них внимание. Поскольку вы этого не сделали, вы смогли написать код, который назначает список, содержащий карты (каждая карта, представляющая один возвращенный результат в БД, отображает имена столбцов в значения в строке) ... в переменную типа List<String>.

Эта модель перевода строки БД на карту - плохая идея. Есть много хороших библиотек для взаимодействия с БД. Например, JDBI прост для понимания, имеет более продуманный API для доступа к результатам. Он даже может отображать результаты на типы данных Java.

Если вам нужно использовать вставленную вами модель, для начала добавьте универсальные шаблоны везде, чтобы компилятор отметил это как ошибку времени компиляции. По крайней мере, сделать это List<Map<String, Object>>.

Позвольте мне еще раз повторить, что переключение вещей на JDBI - намного лучший путь вперед, но в интересах ответа на прямо поставленный вопрос, как только вы добавили обобщения и исправили типы переменных, вы можете сделать это:

List<Map<String, Object>> data = getResultSet(syndicatorName);
for (int rowIdx = 0; rowIdx < data.size(); i++) {
    Map<String, Object> row = data.get(rowIdx);
    for (Map.Entry<String, Object> cell : row.entrySet()) {
        System.out.printf("Row %d cell %s: %s\n", rowIdx, cell.getKey(), cell.getValue());
    }
}

Обратите внимание, что ваши значения ячеек здесь «Объект». Вам нужно привести их к тому типу данных, который вы знаете. Это не идиоматическая Java, но это невозможно исправить без полной перестройки метода getResultSet. Опять же ... JDBI или подобные библиотеки - это то, что вы действительно хотите здесь.

0 голосов
/ 10 сентября 2018

Вам нужен вложенный цикл (по крайней мере, я бы так сделал ... есть не только несколько других способов):

for (HashMap<T,T> i : ArrayList<HashMap<T,T>>) {
    for (T j : i.keySet()){
        i.get(j);
        //further code
    }
}
...