[Java] 자바 ArrayList, List의 객체별(object) 항목별(item) 카운팅(count) 통계값 획득하는 방법
자바 ArrayList 항목별(item),객체별(object) 카운팅, 즉 통계정보를 구현해봅니다. 리스트 항목에 중복되는 항목(아이템)이 있는 경우 카운트하여 볼 수 있습니다. 중복되는 건 없이 모두 1건씩만 있다면 통계정보는 의미 없구요. 대부분 이런 작업은 SQL를 통해서 처리합니다. 통계정보 쿼리를 작성하는 것이 더 빠르게 처리할 수 있습니다. 하지만 SQL를 사용할 수 없는 상황이라면 유용하게 처리할 수 있습니다. 문제는 처리속도입니다. 28,400건을 처리해보려고 시도했으나 가비지컬렉션이 발생하기 시작하더니 뻣어버렸습니다. ㅎㅎㅎ 리스트의 데이터가 많이 없을 경우에 사용해야 될 것 같습니다. 아 파이썬은 빠를까요? 나중에 시도해봐야겠네요.
리스트 항목 카운팅
다음 코드 스니펫과 같이 중복값의 Ineger형 리스트를 값으로 갖는 어레이리스트가 있습니다.
Collections클래스의 frequency()메서드를 사용하여 리스트 항목별 카운트를 구할 수 있습니다. 그리고 그 결과를 HashMap에 담은 후 출력해보는 예제 코드 입니다.
package edu.sample;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ArrayListStatic {
public static void main(String[] args) {
List<List<Integer>> arrayList = new ArrayList<>();
arrayList.add(new ArrayList<>(Arrays.asList(1,3)));
arrayList.add(new ArrayList<>(Arrays.asList(1,3)));
arrayList.add(new ArrayList<>(Arrays.asList(21,13)));
arrayList.add(new ArrayList<>(Arrays.asList(1,5)));
arrayList.add(new ArrayList<>(Arrays.asList(1,5)));
arrayList.add(new ArrayList<>(Arrays.asList(1,5)));
arrayList.add(new ArrayList<>(Arrays.asList(1,5)));
arrayList.add(new ArrayList<>(Arrays.asList(1,5)));
arrayList.add(new ArrayList<>(Arrays.asList(1,5)));
arrayList.add(new ArrayList<>(Arrays.asList(15,3)));
arrayList.add(new ArrayList<>(Arrays.asList(35,3)));
arrayList.add(new ArrayList<>(Arrays.asList(5,3,1)));
arrayList.add(new ArrayList<>(Arrays.asList(25,3)));
arrayList.add(new ArrayList<>(Arrays.asList(15,3)));
arrayList.add(new ArrayList<>(Arrays.asList(25,29)));
arrayList.add(new ArrayList<>(Arrays.asList(25,29)));
arrayList.add(new ArrayList<>(Arrays.asList(1,5)));
arrayList.add(new ArrayList<>(Arrays.asList(25,29)));
arrayList.add(new ArrayList<>(Arrays.asList(1,5)));
Map<List<Integer>, Integer> resultMap = new HashMap<>();
//카운팅
for (int x = 0; x < arrayList.size(); x++) {
resultMap.put(arrayList.get(x), Collections.frequency(arrayList,arrayList.get(x)));
}
//키값 출력
System.out.println("키값: " + resultMap.keySet());
//1,3 리스트 객체의 카운트 출력
System.out.println("1,5 리스트 객체의 카운트: " + resultMap.get(new ArrayList<>(Arrays.asList(1,5))));
//출력
System.out.println(resultMap);
}
}
[코드 실행결과]
키값: [[35, 3], [5, 3, 1], [1, 3], [1, 5], [15, 3], [25, 29], [21, 13], [25, 3]]
1,5 리스트 객체의 카운트: 8
{[35, 3]=1, [5, 3, 1]=1, [1, 3]=2, [1, 5]=8, [15, 3]=2, [25, 29]=3, [21, 13]=1, [25, 3]=1}
데이터가 많은 경우 딜레이가 길어질 수 있음으로 속도를 요구하는 어플리케이션이나 웹사이트에서는 사용에 유의하세요..
[관련글 더 보기]
[Java] 자바 ArrayList 중복 값 제거하기 (HashSet, Stream, TreeSet)
[Java] 자바 ArrayList, List 두 리스트 값 비교 방법 총 정리
[Java] 자바 ArrayList, List 오름차순, 내림차순 정렬 예제코드