JAVA LIST MAP형태의 데이터를 KEY값으로 그룹바이(GROUP BY)하기 DEV / PROGRAMING
2018-10-31 posted by sang12
업무 진행 중 LIST안에 MAP형태로 들어가 있는 데이터를 키값으로 그룹바이 해서 가격별로 합계를 구해야 될 일이 있었습니다.
INPUT과 OUTPUT은 아래와 같습니다.
INPUT :: [{orderNumber=1, price=10,}, {orderNumber=1, price=18}, {orderNumber=2, price=99}, {orderNumber=2, price=1}, {orderNumber=3, price=87}]
OUTPUT :: [{orderNumber=1, price=28}, {}, {orderNumber=2, price=100}, {orderNumber=3, price=87}]
SOURCE.
List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
//SAMPLE DATA 생성
for(int i=0; i<=10; i++){
Random generator = new Random();
Map<String, Object> tempMap = new HashMap<String, Object>();
tempMap.put("price", i*generator.nextInt(10));
tempMap.put("orderNumber", generator.nextInt(3));
data.add(tempMap);
}
System.out.println("초기데이터::"+data);
//GROUP BY된 데이터를 받을 MAP
Map<String, Map<String, Object>> resultMap = new HashMap<String, Map<String, Object>>();
for(int i=0; i<data.size(); i++){
String orderNumber = data.get(i).get("orderNumber").toString(); //KEY VALUE
if(resultMap.containsKey(orderNumber)){
//KEY값이 존재하면 해당 키값의 해당되는 가격을 가져와 더해줌
resultMap.get(orderNumber).put("price", Integer.parseInt(resultMap.get(orderNumber).get("price").toString())
+ Integer.parseInt(data.get(i).get("price").toString()));
}else{
//KEY값이 존재하지 않으면 MAP에 데이터를 넣어줌
resultMap.put(orderNumber, data.get(i));
}
}
System.out.println(resultMap);
RESULT
INPUT::
[{price=0, orderNumber=2}, {price=4, orderNumber=0}, {price=12, orderNumber=0}, {price=21, orderNumber=0}, {price=8, orderNumber=0}, {price=5, orderNumber=1}, {price=18, orderNumber=1}, {price=0, orderNumber=2}, {price=40, orderNumber=1}, {price=27, orderNumber=0}, {price=0, orderNumber=0}]
OUTPUT::
{2={price=0, orderNumber=2}, 1={price=63, orderNumber=1}, 0={price=72, orderNumber=0}}
1. 위에 MAP처럼 데이터를 받을 원하는 형태의 빈 MAP을 만듬.(resultMap)
2. resultMap에 key 값이 존재 하지 않으면 map에 넣어줌(put)
3. resultMap에 key 값이 존재하면, 해당 key값의 value인 Map데이터의 가격을 가져와 합해줌.
4. 최종적으로 key값으로 그룹바이 되며 price의 sum값을 구할 수 있습니다.
해당 MAP에 키값이 존재하면 기존의 있던 키값에 가격을 더해주고 키값이 존재하지 않으면 MAP에 넣어주주면 최종적으로 원하는 결과값을 얻을 수 있습니다.