시도 뭔가 :
Map<String, List<Integer>> map = new LinkedHashMap<>();
// Assuming that you are working with query output resultset
try {
stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
List<Integer> li = new ArrayList<>();
li.add(rs.getInt("PLAY"));
li.add(rs.getInt("LISTEN"));
li.add(rs.getInt("DISPLAY"));
li.add(rs.getInt("COMMENT"));
map.put(rs.getString("ID"), li);
}
} catch (SQLException e) {
/* SQLException handler */
} finally {
if (stmt != null) { stmt.close(); }
}
map = sortByValues(map);
for (Map.Entry<String, List<Integer>> entry: map.entrySet()) {
System.out.println(entry.getKey() + "," + entry.getValue());
}
}
public static Map<String, List<Integer>> sortByValues(Map<String, List<Integer>> map) {
List<Map.Entry<String, List<Integer>>> list =
new LinkedList<>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, List<Integer>>>() {
public int compare(Map.Entry<String, List<Integer>> m1, Map.Entry<String, List<Integer>> m2) {
int sum1 = 0;
for(Integer d : m1.getValue())
sum1 += d;
int sum2 = 0;
for(Integer d : m2.getValue())
sum2 += d;
return (new Integer(sum2)).compareTo(new Integer(sum1));
}
}) ;
Map<String, List<Integer>> result = new LinkedHashMap<>();
for (Map.Entry<String, List<Integer>> entry: list) {
result.put(entry.getKey(), entry.getValue());
}
return result;
}
참고 : 나는 비교를 할 수있는 별도의 방법 sortByValues()
있습니다. 따라서 try-catch
뒤에 익명 블록을 구현하는 대신 코드를 깔끔하게 읽고 재사용 할 수 있습니다.
여기가 어떻게됩니까? 우리의 목표는 데이터베이스에서 가져온 다른 값으로 ID를 정렬하는 것입니다. 나는 여기 Map
데이터 구조가 적절하다고 느낍니다. 일반적인 방법으로 Map<String, List<Integers>>
으로 표시되는 예제 맵.
Map<String, List<Integer>> map = new LinkedHashMap<>();
는
List<Integer> li = new ArrayList<>();
while
는 루프 내부 Arraylist
객체가 데이터베이스로부터 페치 된 각각의 값을 저장하기 위해 생성 한 쌍을 저장하기 위해 연결된 해시 맵을 생성한다. 이 루프 내에서 스코프가 사라집니다.
map.put(id, li);
는 Map<String, List<Integer>>
map = sortByValues(map);
그것이 갖는 값에 기초하여 분류 맵을 가져 오는 정적 sortByValues()
액세스하는 포맷으로 각 사용자 ID 및 값을 추가한다.
sortByValues(Map<String, List<Integer>> map)
재정의가 Comparator
의 compare()
은 익명의 값에 기초하여 정렬이 수행한다. 각 ID 값을 합하여 비교합니다.
모의 실행 :
Map<String, List<Integer>> map = new LinkedHashMap<>();
// Map<String, List<Integer>> map = new HashMap<>();
List<Integer> li = new ArrayList<>();
li.add(1);
li.add(2);
li.add(3);
// MathUtils.sum()
map.put("a", li);
// map.put("a", 5);
List<Integer> li2 = new ArrayList<>();
li2.add(3);
li2.add(-1);
li2.add(1);
map.put("b", li2);
List<Integer> li3 = new ArrayList<>();
li3.add(10);
li3.add(-1);
li3.add(9);
map.put("c", li3);
map = sortByValues(map);
for (Map.Entry<String, List<Integer>> entry: map.entrySet()) {
System.out.println(entry.getKey() + "," + entry.getValue());
}
결과 :
c,[10, -1, 9]
a,[1, 2, 3]
b,[3, -1, 1]
당신이 정렬 된 결과를 가져 오기 위해 자바를 사용하여 결과 집합을 처리하거나 SQL 쿼리를 최적화 하시겠습니까? –
java에서 결과를 처리하려고합니다. – user2423768
pojo 클래스를 보여주세요. – vikingsteve