2016-07-08 3 views
2

모든 테이블에서 가장 높은 값을 가진 사람을 얻고 싶습니다. 다음은 동일한 ID하지만 서로 다른 tables.Here에서 오는 관련된이 모든 계산에서모든 heighest 숫자를 기준으로 정렬

Id play(count) listen(count) display(count) comment(count) 
a 3   1    4    2 
b 2   5    3    7 
c 6   3    0    1 
d 0   0    5    4 
e 6   4    8    9 
f 4   2    5    7 

DB를 내가 출력 정렬과 같은 전자 (6,4,8,9)를 원하는에서 내가 검색의 예이다. 어떻게 정렬 할 수 있습니까? 이 같은

+0

당신이 정렬 된 결과를 가져 오기 위해 자바를 사용하여 결과 집합을 처리하거나 SQL 쿼리를 최적화 하시겠습니까? –

+0

java에서 결과를 처리하려고합니다. – user2423768

+0

pojo 클래스를 보여주세요. – vikingsteve

답변

1

시도 뭔가 :

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) 

재정의가 Comparatorcompare()은 익명의 값에 기초하여 정렬이 수행한다. 각 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] 
관련 문제