[Java] HashMap를 이용한 데이터 그룹핑하기

Study/Java 2019. 12. 20. 21:19 Posted by meanoflife
반응형

HashMap를 이용한 데이터 그룹핑하기

 

 

데이터를 분류하고, 분류된 특정 데이터로만 작업을 하고자 할때가 있습니다.
하나의 그룹만 사용한다면, 조건에 맞는 데이터만 배열에 담아서 사용하면 되지만,
그룹화한 데이터를 조건에 따라 그때 그때 불러와서 사용해야 한다면 어떨까요?

HashMap을 이용하여 데이터를 그룹화하고 조건에 따라 불러쓰는 프로그램입니다.
샘플DATA 파일을 읽어, "국어, 영어, 수학"으로 그룹화하여 점수를 관리합니다.

* 샘플DATA

Sample Data


* SOURCE

    public static void main(String[] args) { 
         
        HashMap<String, ArrayList> maResult = new HashMap<String, ArrayList>();  // 결과 저장용  
         
        ArrayList arrReadFile = TxtFile.readArr( "C:\\workspace\\Test\\B.dat" ); 
         
        // 파일의 DATA 출력 
        for( int i = 0; i < arrReadFile.size(); i++ ) System.out.println( arrReadFile.get( i ) ); 
         
        // String.split()를 이용한 DATA분할 
        for( int i = 0; i < arrReadFile.size(); i++ ) { 
             
            String[] saRow = arrReadFile.get( i ).split( "," );  // Delimeter( , )로 DATA 분할  
             
            // 국어 
            ArrayList arrKor  = new ArrayList(); 
            if( maResult.containsKey( "KOR" ) ) arrKor = maResult.get( "KOR" );  // 기등록된 Array정보 
             
            arrKor.add( saRow[0] + ":" + saRow[1] );  maResult.put( "KOR", arrKor );  // 이름:점수 
             
            // 영어 
            ArrayList arrEng  = new ArrayList(); 
            if( maResult.containsKey( "ENG" ) ) arrEng = maResult.get( "ENG" );  // 기등록된 Array정보 
             
            arrEng.add( saRow[0] + ":" + saRow[2] );  maResult.put( "ENG", arrEng );  // 이름:점수 
             
            // 수학 
            ArrayList arrMat = new ArrayList(); 
            if( maResult.containsKey( "MAT" ) ) arrMat = maResult.get( "MAT" );  // 기등록된 Array정보 
             
            arrMat.add( saRow[0] + ":" + saRow[3] );  maResult.put( "MAT", arrMat );  // 이름:점수 
             
        } 
         
        // 출력 
        ArrayList arrResult = new ArrayList(); 
         
        System.out.println( "\n국어------------------------------\n" ); 
        arrResult = maResult.get( "KOR" ); 
        for( int i = 0; i < arrResult.size(); i++ ) System.out.println( "[국어] " + arrResult.get( i ) ); 
         
        System.out.println( "\n영어------------------------------\n" ); 
        arrResult = maResult.get( "ENG" ); 
        for( int i = 0; i < arrResult.size(); i++ ) System.out.println( "[영어] " + arrResult.get( i ) ); 
         
        System.out.println( "\n수학------------------------------\n" ); 
        arrResult = maResult.get( "MAT" ); 
        for( int i = 0; i < arrResult.size(); i++ ) System.out.println( "[수학] " + arrResult.get( i ) ); 
    } 


* RESULT

  - 파일의 DATA 출력

    이름, 국어, 영어, 수학
    홍길동, 10, 20, 30
    이순신, 40, 50, 60

  - 출력

    국어------------------------------

    [국어] 이름: 국어
    [국어] 홍길동: 10
    [국어] 이순신: 40

    영어------------------------------

    [영어] 이름: 영어
    [영어] 홍길동: 20
    [영어] 이순신: 50

    수학------------------------------

    [수학] 이름: 수학
    [수학] 홍길동: 30
    [수학] 이순신: 60


HashMap는 Key:Value형태로 데이터를 관리합니다.
Value객체에 ArrayList를 사용하므로써, n개의 데이터를 보관할 수 있도록 하였습니다.

    if( maResult.containsKey( "KOR" ) ) arrKor = maResult.get( "KOR" );  // 기등록된 Array정보

파일의 정보를 Line단위로( 한줄씩 ) 처리하므로,
HashMap의 동일한 [key]로 Value값이 있을 경우, 이전 값을 유지하기 위해 위와 같이 처리하였습니다.
이전 값을 ArrayList로 가지고 온 후, ArrayList.add()하여 값을 추가합니다.

※ 참고

    - 링크 ☞ 파일 핸들링 : 파일 읽기
    - 링크 ☞ String.split()를 이용한 데이터 분할하기

    - ArrayList.add() : 배열에 값을 추가합니다.

    - HashMap.containsKey( {Key} ) : {Key}문자열로 저장된 데이터가 있는지를 체크합니다.( return true/false )
    - HashMap.get( {Key} ) : {Key}로 저장된 Value값을 가져옵니다.
    - HashMap.put( {Key}, {Value} ) : {Key}로 {Value}객체를 저장합니다.

끝.

반응형