Сортировать список <HashMap <String, Object >> по значению ключа - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть список этого типа List < HashMap < String, Object >> ResultSet

public List ResultSetToMap(ResultSet rs) throws SQLException {
    ResultSetMetaData md = rs.getMetaData();
    int columns = md.getColumnCount();
    List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();

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

, и я хочу отсортировать значения списка по значению клавиши «PROBABILITY».Когда я печатаю ключи и их значения, я получаю это:

l_commitdate=1996-02-12
l_partkey=155190
PROBABILITY=56.63499683535207
l_commitdate=1996-02-28
l_partkey=67310
PROBABILITY=49.93142590485798
l_commitdate=1996-03-05
l_partkey=63700
PROBABILITY=56.88804620364059
l_commitdate=1996-03-30
l_partkey=2132
PROBABILITY=55.511179358539486

И я хотел получить это:

l_commitdate=1996-03-05
l_partkey=63700
PROBABILITY=56.88804620364059
l_commitdate=1996-02-12
l_partkey=155190
PROBABILITY=56.63499683535207
l_commitdate=1996-03-30
l_partkey=2132
PROBABILITY=55.511179358539486
l_commitdate=1996-02-28
l_partkey=67310
PROBABILITY=49.93142590485798

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Похоже, вы знаете структуру каждой строки в вашем ResultSet, поэтому вам будет намного проще, если вы создадите объект, представляющий каждую строку вместо Map<String, Object>. Я назвал это Part, так как это то, на что, похоже, ссылается ключ, но называйте это как угодно.

public class Part {
    private LocalDate commitDate;
    private long partKey;
    private BigDecimal probability;

    //getters and setters
}

С этим вы можете изменить свой метод так, чтобы он возвращал список Part s (в качестве отступления: вы не должны использовать нетипизированный список здесь. Даже если вы не будете следовать остальным моим советам, подпись вашего метода должен всегда иметь тип для возвращаемого List. Имена методов Java также должны начинаться с символа в нижнем регистре - по соглашению только class имеют имена, которые начинаются с верхнего регистра).

public List<Part> resultSetToParts(ResultSet rs) throws SQLException {
    List<Part> list = new ArrayList<>(); //No need to specify the generic type again, we can use the diamond operator for Java 7 and later

    while (rs.next()) {
        Part part = new Part();

        part.setCommitDate(rs.getDate("l_commitdate").toLocalDate()); //Note: this is vulnerable to NullPointerExceptions if the date can be null
        part.setPartKey(rs.getString("l_partkey"));
        part.setProbability(BigDecimal.valueOf(rs.getDouble("PROBABILITY")));

        list.add(part);
    }
    return list;
}

Теперь, когда мы проделали небольшую работу по настройке, вы можете легко отсортировать ее по любому полю:

List<Part> parts = resultSetToParts(rs);
parts.sort(Comparator.comparing(Part::getProbability);
0 голосов
/ 08 апреля 2019

Предполагая, что значения вероятности имеют тип double:

list.sort((p1,p2)-> Double.compare( (double)p2.get("PROBABILITY"),(double) p1.get("PROBABILITY")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...