상세 컨텐츠

본문 제목

자바 리스트 안에 맵 값 정렬 (java list map value sort)

프로그램 언어/Java

by husks 2015. 3. 4. 16:41

본문

반응형
리스트에 맵이 들어있는데 해당 맵의 특정값(sum)이 높은 순서로 다시 리스트에 넣어서 정렬하는 소스 입니다.

15라인 ~ 47라인은 기초데이터 생성입니다. (생성시에 각 맵에 고유한 수를 넣어주시기 바랍니다. 차후 배열번호 추출 키로 쓰기 위해 0부터 순서대로 하는 것을 추천합니다.)

맵의 값 정렬만 보실 분들은 http://huskdoll.tistory.com/175을 보시면 됩니다.


참조: http://stackoverflow.com/questions/17533272/how-to-make-a-generic-valuecomparator-for-sorting-multiple-hashmaps


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
 
 
public class NewSort {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
 
        //List 안에있는 Map 데이터를 입력 (num은 0부터 하는걸 추천: 배열번호로 추출하기 때문)
        String sample = "sum=4.3207455E8, num=0, 0=3.5337459E7, comp_nm=A사"
                + "`sum=2.191123E7, num=1, 0=1991930.0, comp_nm=B사"
                + "`sum=8030636.0, num=2, 0=730057.0, comp_nm=C사"
                + "`sum=6.7682255E7, num=3, 0=6152932.0, comp_nm=D사"
                + "`sum=1195123.0, num=4, 0=108647.0, comp_nm=E사";
 
        String[] main = sample.split("`");
 
        List<HashMap> listData = new ArrayList();
 
        HashMap<String, Object> hashmap1 = new HashMap<String, Object>();
 
        for(String sub: main){
 
            String[] main2 = sub.split(",");
 
            hashmap1 = new HashMap<String, Object>();
            for(String sub2: main2){
 
                hashmap1.put(sub2.split("=")[0].trim(), sub2.split("=")[1].trim());
 
            }
 
            listData.add(hashmap1);
 
        }
        
        //데이터 생성 완료
        for(HashMap<String,Object> tmp :listData){
 
            System.out.println(tmp);
 
        }
        
        System.out.println("========================================================");
        
        //List 안에있는 Map 중에서 sum이 큰 수로 내림정렬 하시오
        HashMap<String,Double> map = new HashMap<String,Double>();
        ValueComparator bvc =  new ValueComparator(map);
        TreeMap<String,Double> sorted_map = new TreeMap<String,Double>(bvc);
        
        //리스트에서 순번과 합계만 따로 맵에 넣는다.
        for(HashMap<String,Object> hashmap: listData){
 
            map.put((String) hashmap.get("num"), Double.parseDouble((String) hashmap.get("sum")));
 
        }
        
        //정렬 (Map의 값 정렬)
        sorted_map.putAll(map);
        //맵 정렬 출력
        System.out.println(sorted_map);
        System.out.println("========================================================");
        
        List<HashMap<String,Object>> resultListData = new ArrayList();
 
        for (Map.Entry<String,Double> entry : sorted_map.entrySet()) {
            //정렬한 리스트에서 순번을 배열번호로 변경하여 원본 리스트에서 추출
            resultListData.add(listData.get(Integer.parseInt(entry.getKey())));
        }
        
        //정렬 결과
        for(HashMap<String,Object> tmp :resultListData){
            
            System.out.println(tmp);
 
        }
        
    }
 
}
 
 
class ValueComparator implements Comparator<String> {
 
    Map<String, Double> base;
    /**
     * @param base
     */
    public ValueComparator(Map<String, Double> base) {
        this.base = base;
    }
 
    // Note: this comparator imposes orderings that are inconsistent with equals.    
    public int compare(String a, String b) {
        if (base.get(a) >= base.get(b)) {
            return -1;
        } else {
            return 1;
        } // returning 0 would merge keys
    }
}
 



반응형

'프로그램 언어 > Java' 카테고리의 다른 글

BigDecimal 숫자 형변환  (0) 2015.03.13
Map의 value(값)로 정렬(Sort)  (0) 2015.03.05
java submit html form  (0) 2015.02.17
파일 인코딩 변경 (복사)  (0) 2014.06.20
Java Collection (Set, List, Map)  (0) 2014.05.22

관련글 더보기

댓글 영역