트러블슈팅/JAVA

[JAVA] 반복문에서 삽입한 Map 데이터가 모두 빈 값이 나오는 문제

블체. 2025. 6. 13. 00:38

[코드작성 의도]

배열 안에 hashMap 데이터를 넣는 것. 

hashMap의 데이터 형식

 > key: columns 배열 내부에 있는 문자

 > value: arryNode 내부에 있는 문자 (parsing 처리한 json 데이터)

 

[예상동작]

1. 첫 번째 for 문이 arryNode 데이터 개수만큼 반복 시작

2. 두 번째 for 문이 columns 데이터 개수만큼 반복 시작

3. HashMap인 rowValues 에 columns 의 데이터를 key 값으로 한 데이터 삽입

4. 두 번째 for 문 동작 종료

5. ArrayList 타입의 rowValueArray에 rowValues를 삽입

6. rowValues의 값을 제거.

7. 첫 번째 for 문 반복

8. 최종 데이터 형태 (rowValueArray)

  > [{id=543, name=apple, dist=168.142.20.3}, ....,  {id=576, name=banana, dist=163.142.20.4}]

 

[실제결과]

rowValueArray 값

 > [{}, ... ,{}]

 

[문제코드]

 List<Map<String,String>> rowValueArray = new ArrayList<>();
 Map<String, String> rowValues = new HashMap<>();

// columns: String 배열
// arryNode: jackson 으로 파싱한 문자열
for (int i = 0; i < arryNode.size(); i++) {
    for (int j = 0; j < columns.length; j++) {
    	rowValues.put(columns[j], arryNode.get(i).get(j).asText());
    }
    // rowValues의 데이터 확인 > 데이터 있음
    System.out.println(rowValues);
    rowValueArray.add(rowValues);
    rowValues.clear();
}

// rowValues를 넣은 rowValueArray가 빈값으로 나옴.
System.out.println(rowValueArray);

 

[문제원인]

rowValues에 데이터 입력
rowValueArray.add(rowValues) → 리스트에 같은 객체 참조 추가
rowValues.clear() → 배열에 있는 모든 Map도 함께 비워짐 (같은 객체이므로)


[해결]

 List<Map<String,String>> rowValueArray = new ArrayList<>();

// columns: String 배열
// arryNode: jackson 으로 파싱한 문자열
for (int i = 0; i < arryNode.size(); i++) {
 Map<String, String> rowValues = new HashMap<>(); // Map 생성 시점을 for문 내부로 변경
 
    for (int j = 0; j < columns.length; j++) {
    	rowValues.put(columns[j], arryNode.get(i).get(j).asText());
    }
    // rowValues의 데이터 확인 > 데이터 있음
    System.out.println(rowValues);
    rowValueArray.add(rowValues);
    //rowValues.clear(); > clear() 가 필요 없어졌음
}

// rowValueArray의 값이 정상으로 출력
System.out.println(rowValueArray);


List<Map<String,String>> rowValueArray = new ArrayList<>();
선언을 for 문 내부에서 해서 반복할 때마다 생성시키자. .clear 는 불필요.

 

반응형