반복문을 이용한 해쉬맵 값 부여

조회수 571회

반복문을 이용해 키에 값을 부여하려고 코드를 작성했습니다.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Solution {

    public static void main(String[] args) {        

        Map<Integer, List<String>> map = new HashMap<Integer, List<String>>();
        List<String> array = new ArrayList<String>();

        String num[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };

        for (int i = 1; i <= n; i++) {          
            map.put(i, null);
            for (int j = i - 1; j < num.length; j += n) {

                int key = i;
                array.add(num[j]);
                map.put(key, array);
            }
                array.clear();
        }
        System.out.println(map);

    }

}   

기대한 결과 {1=[1, 4, 7], 2=[2, 5, 8], 3=[3, 6, 9]}

실행한 결과 {1=[], 2=[], 3=[]}

키를 다르게 하여 값을 부여했는데도 빈 ArrayList 만 들어가있습니다. 이 코드가 기대한 결과 같이 나오게 하려면 어떻게 고쳐야 하나요?

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 변수 n은 뭔가요? 정영훈 2019.9.23 06:21
  • 아 죄송합니다. n은 해시 맵의 키 개수를 입력하는 부분인데 이걸 빼먹었습니다. 현재 n은 3으로 가정하고 코드를 돌렸습니다. 알 수 없는 사용자 2019.9.23 16:48

1 답변

  • 안되는 이유는 간단합니다.

    array.clear(); 를 실행하면 array가 다 지워집니다.

    put를 했으니 clear() 시 안지워지는 것이 아닙니다.

    put은 array의 레퍼런스만 저장을 합니다. 즉 put 뒤에 clear 을 하면 삭제가 됩니다.

    for 반복시 마다 List<String> array = new ArrayList<String>(); 를 실행하여 array 를 새롭게 생성하세요.

    map.put(key, array); 구문도 중첩된 for 가 끝난다음에 실행되어야 합니다.

    • 감사합니다. 덕분에 깔끔하게 해결하였습니다. 추가적으로 궁금한게 있는데 해쉬 맵에서는 값이 아닌 레퍼런스를 저장한다고 하셨는데 레퍼런스라는 뜻이 값이 저장되어있는 메모리 주소를 뜻하는지요? 만약 그렇다면 일부 키의 값을 지우게 된다면 값이 아닌 값이 들어있는 주소만 지워지고 값은 메모리 안에서 살아있나요? 알 수 없는 사용자 2019.9.24 16:29
    • 살아있습니다만 자바의 경우 가비지 컬렉터가 있어서 알아서 메모리에서 삭제합니다. 만약 c/c++ 라면 일일이 메모리 관리를 해야 합니다. 정영훈 2019.9.24 22:25
    • 아, 이제야 말끔히 해결되었습니다. 감사합니다. 알 수 없는 사용자 2019.9.25 18:54

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)