[코드작성 의도]
배열 안에 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 는 불필요.