피부탄
2k
2017-01-19 16:41:16
5
16655

list를 map 형태로 전환


만들어져 있는 공통만 써오다가

내가 변환 하려니 이해가 쉽지가 않네요.


List 형태로 데이터가 들어온걸 가지고

Map 형태로 바꿔서 key,value 식으로 사용할수 있는 공통을 만들어보려고 합니다.


조언 부탁드립니다.



3
  • 답변 5

  • redeye0922
    1k
    2017-01-19 16:46:17 작성 2017-01-19 16:51:32 수정됨

    list 를 for문돌리면서 map에 담아에요 리스트에있는 값을 

    ex)

    List<Map<String,Object>> list;

    int index = 0;

    Map<String,Object> map = new HashMap<String,Object>();

    if(null != list && list.size() >0){

      for(Map<String,Object> map: list){

        for(Map.Entry<String, Object> entry: map.entrySet()){

          String key = entry.getKey();

          Object value = entry.getValue();

          map.put(key,value);

        }

        index++

      }

    }

  • 오로롱이
    1k
    2017-01-19 17:47:24 작성 2017-01-19 17:49:05 수정됨

    작성자 님이 원하시는 건 이거 같네요.

    제가 기존에 했던 코드 좀 응용해서 간단하게 만들어 봤습니다.

    결과적으로 보면

    이런 리스트를

    위와 같이 리스트 맵 형태로 바꿔 줍니다.

    VO 는 테스트용으로 만들었습니다.

    package main;
    
    public class TestVO {
    	private String test1;
    	private String test2;
    	private String test3;
    	public String getTest1() {
    		return test1;
    	}
    	public void setTest1(String test1) {
    		this.test1 = test1;
    	}
    	public String getTest2() {
    		return test2;
    	}
    	public void setTest2(String test2) {
    		this.test2 = test2;
    	}
    	public String getTest3() {
    		return test3;
    	}
    	public void setTest3(String test3) {
    		this.test3 = test3;
    	}
    }
    

    메인 소스 입니다.

    package main;
    
    import java.lang.reflect.Field;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class LogCreate {
    	
    	public static void main(String args[]) {
    //		LogCreateService service = new LogCreateImpl();
    //		service.getTextData();
    		//service.saveShoppingData();
    		//service.saveNewsData();
    		List<TestVO> testList = new ArrayList<TestVO>();
    		for (int i = 0; i < 10; i++) {
    			TestVO vo = new TestVO();
    			vo.setTest1("test 1 value : " + i);
    			vo.setTest2("test 2 value : " + i);
    			vo.setTest3("test 3 value : " + i);
    			testList.add(vo);
    		}
    		convertListToMap(testList);
    	}
    	
    	public static <T> List<Map<String, Object>> convertListToMap(Collection<T> target) {
    		List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();
    		for (T element : target) {
    			Map<String,Object> resultMap = new HashMap<String,Object>();
    			Field[] fieldList = element.getClass().getDeclaredFields();
    			if (fieldList != null && fieldList.length > 0) {
    				try {
    					for (int i = 0; i < fieldList.length; i++) {
    						String curInsName = fieldList[i].getName();
    						Field field = element.getClass().getDeclaredField(curInsName);
    						field.setAccessible(true);
    						Object targetValue = field.get(element);
    						resultMap.put(curInsName, targetValue);
    					}
    					resultList.add(resultMap);
    					
    				} catch (Exception e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    		}
    		return resultList;
    	}
    }
    

    TestVO 대신에 다른 클래스도 만들어서 테스트 해 보세요

    공통이라 함은 하드코딩이 없이 다이나믹하게 파라미터를 받아 처리하는 게 핵심이죠 ㅎㅎ

  • 피부탄
    2k
    2017-01-19 19:13:59 작성 2017-01-19 19:14:38 수정됨

    @오로롱이

    친절한 답변 감사드립니다.

    List안에 객체가 TestVO 형태로 있고 결국 그것을 hashmap 형태로 변환을 하는 형태가 제가원하던

    리턴 형태입니다.

    사실  복사해서 써보니 잘 되서 그냥 쓰고 싶은데 ㅠㅠ

    이번 기회에 이해를 하고 넘어가기 위해 고민을 좀 더 해보려고합니다. 그래서 convert 하는 과정중에 이해가 잘 안되는 부분이 있어서 추가적인 몇가지 질문 답변 부탁드리겠습니다.


    public static <T> List<Map<String, Object>> convertListToMap(Collection<T> target) {
    List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();
    for (T element : target) {


    1.List 에서 hashmap 형태로 변경을 하기 위해선 Collction객체 타입으로 받아야 되는 부분과

    2.for문절의 for (T element : target) { 소스가 잘 이해가 되지 않습니다.  특히 <T>...

    제가 알고 있는 for문은 for (int i ; i<..... )


    답변부탁드리겠습니다.

  • 오로롱이
    1k
    2017-01-19 20:55:29

    예전에는 이론적인 부분도 많이 공부하고 그랬는데 요즘은 거의 본능적으로 코딩하다 보니 가물가물 하네요 ㅋㅋ

    Collection은 인터페이스 개념입니다.

    ArrayList, Linked List 와 같은 List 형식이 이 Collection 인터페이스를 상속받고 있죠

    파라미터가 ArrayList 형식이기 때문에 이걸 받아서 처리하기 위해 리스트의 인터페이스인 Collection을 파라미터 유형으로 지정했습니다.

    제네릭 List 와 Map Interface 개념은 구글링이나 검색 해 보면 많이 나오니 차근차근 하시면 되요

    <T> 이거는 객체 인스턴스를 다이나미컬하게 받기 위해 썼습니다.

    <클래스명> 이렇게 하면 클래스를 지정해서 리스트 객체를 생성하는데 이걸 T로 하게 되면 파라미터로 넘어오는 클래스 객체 유형에 따라 다이나믹하게 처리를 할 수 있습니다.

    <E>도 있는데 여기서는 엘리먼트 안에 있는 각각의 오브젝트 타입 정보들을 조회하여 처리하기 위해 T로 했습니다. 

    E는 element T는 Type 이렇게 대충 이해하고 코딩하는데 뭐 되기만 하면 되죠 ;;

    <E>로 해도 동작 하는 지 모르겠네요

    for 문은 앞서 말했던 list 와 map 의 개념을 이해하면 되는데요

    list 형식은 for (T element : list) 위와 같은 형식이 가능하고요

    map이나 단순 배열은 위와 같은 방식을 지원하지 않아서 for(int i = 0; i < length; i++) { } 이렇게 처리해야 합니다.

    제가 연차가 쌓이다 보니 이렇게 되었나 싶은데 저는 골치하픈 이론을 파고 들지는 않아요

    링크드리스트와 그냥 리스트 차이가 뭐냐 객체 인스턴스 개념이 뭐냐 뭐의 정의는 뭐냐 이걸 쓰는 이유가 뭐냐 이런거 생각하기 골치아프잖아요?

    지금 제가 만들어드린 코드도 딱 보고 아 리스트는 Collection이라는 형식으로 받는구나

    <T>라고 지정하면 파라미터로 받는 클래스에 따라 형식이 결정되는구나

    List<String> list 와 같은 list형식의 값은 for (String data : list) 이렇게 처리할 수 있구나

    라고 전체적인 흐름만 파악하면 금방금방 코딩할 수 있죠

    저는 실전 위주 개발자입니다. ㅋㅋ

    뭐 제 생각에 반박하시는 분도 많으시겠지만 일단 저는 전체적인 흐름만 파악하고 '구글링->코딩->실행->디버깅->수정' 이렇게 하고 있고 이런 방식으로 지금까지 개발자로 잘 먹고살고 있습니다. ㅎㅎ

  • 피부탄
    2k
    2017-01-19 21:59:17

    중간중간 제가 놓치고 있었던 부분 잘 캐치해주셧네요.


    전 아무래도 전투형으로 일을한거 같습니다.

    복사해서 변수명 바꾸고 되면 바로 다음부분을 진행 했거든요 ㅋㅋ

    다시 한번 감사인사드립니다. ^^

  • 로그인을 하시면 답변을 등록할 수 있습니다.