Uwanggood
94
2018-12-05 21:51:15
7
132

자바 for each문 -add관련되서 질문드립니다ㅠㅠ


for(map :list ) 형태로 돌려서

if( (string)map.get("bulabula").eqals...)(

   map1.put( value1.....)
   list1.add(map1)
)else if.....

같은형태로 만들었고 각 해당하는값을 잘넣어줍니다
그런데 돌면서 새로운값을 맵에넣는순간 기존에 리스트에넣었던 값까지 새로운값으로바뀝니다ㅠㅠ
결국 포문다돌면 리스트안에는 마지막맵에넣었던값이 n번 돌았던만큼 있는데... 
얕은복사가되서 그렇다는데 이거 어떻게해결해야하죠ㅠㅜ for each문안에 해당맵을 계속 new쓰면서 해야할까요?ㅠㅠ
0
0
  • 답변 7

  • 엔카나
    319
    2018-12-06 00:59:31

    복사문제가 아니라 list에 동일한 Map을 add해서 그런겁니다.

    어떤걸 의도하신건지 정확하게 적어주셔야 할 것 같네요.

    0
  • Uwanggood
    94
    2018-12-06 01:22:41

    for문을 돌면서 값이 맞는 if에 들어가면맵에 add를시켜서 리스트에넣는 방식입니다... 퇴근해서 사진을못찍네요ㅠㅠ 맵을하나를쓰면 안돠나요?

    0
  • 엔카나
    319
    2018-12-06 01:31:40

    가능할때 정확한 코드로 다시 질문주셔요

    0
  • Uwanggood
    94
    2018-12-06 01:44:12
    넵ㅠㅠ
    0
  • Nira
    26
    2018-12-06 01:52:05

    엔카나님의 말씀을 코드로 보여드리겠습니다.

    질문에 적혀있는 map1 정의가 for문 밖에 있나요? 그럼 같은 map이 list에 들어가게 되어 list에 들어간 모든 map이 같습니다.


    public class test {
    	public static void main(String args[]) {
    		new Play();
    	}
    }
    
    class Play {
    	private Map<String, Integer> map = new HashMap<>();
    	private List<Map<String, Integer>> list = new ArrayList<>();
    	private List<Map<String, Integer>> list2 = new ArrayList<>();
    	
    	Play() {
    		for(int i = 0; i < 10; i++) {
    			Map<String, Integer> map2 = new HashMap<>();
    			map.put("Key", i);
    			map2.put("Key", i);
    			list.add(map);
    			list2.add(map2);
    		}
    		
    		for(Map<String, Integer> map: list) {
    			System.out.println(map.get("Key"));
    		}
    		
    		System.out.println("=====");
    		
    		for(Map<String, Integer> map: list2) {
    			System.out.println(map.get("Key"));
    		}
    	}
    }


    실행하면 아래와 같이 나옵니다.


    9
    9
    9
    9
    9
    9
    9
    9
    9
    9
    =====
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    


    0
  • Uwanggood
    94
    2018-12-06 02:19:36

    예제주신 밖에다선언한것 맞습니다!ㅠㅠ 

    키값이 전부다르면 기존에꺼 안엎을줄알았는데키갑이 달라도 엎어치나보네요ㅠㅠ 감사합니다!

    0
  • Nira
    26
    2018-12-06 02:31:12

    https://wikidocs.net/265

    https://brunch.co.kr/@kd4/2


    참고로 말씀드리면 primitive type이랑 reference type이 넘어갈때 결과가 달라집니다. 그래도 자바의 본질은 call by value라는 것을 잊어서는 안되겠습니다.

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