본문 바로가기

알고리즘 문제 풀이

Q7. convertListToObject // (!map.containsKey) 이해함

 

 

 

 

 

 

 

 

===========답변================

 

public class Solution { 
  public HashMap<String, String> convertListToHashMap(String[][] arr) {
    // TODO:
    /*
    참고사항
    arr[i].length는 0 or 2 라고 나와있음. 
    {}안의 요소가 0개 혹은 2개 라는 말임, 하지만 arr.length(행의 수)는 모름.
    arr[i][0] : Key
    arr[i][1] : value
    <문제 해결 순서>
    1. 문제대로 HashMap<String, String> 생성해서 진행.
    2. map.put(arr[i][0], arr[i][1]) 넣으면됨.

    주의사항 
    1. 중복되는 키의 경우, 초기의 값 사용
    2. 빈 배열을 입력받으면 빈 HashMap을 리턴.
    */
 
    HashMap<String, String> map = new HashMap<String, String>();
    // 빈 배열일 경우, 빈 HashMap 리턴.
    if (arr.length == 0) {
      return map;
    }
    
    // arr.length는 미지수임으로 for문 i 진행.
    for (int i = 0; i < arr.length; i++) {
      
      // arr[i].length는 0 혹은 2라고했음. 2라는 것으로 if문 진행. // 왜그런지 모름;;
      if (arr[i].length != 0) {
 
      // map이 arr[i][0]을 가지고 있지 않을 경우, (아마 중복된 키값이 없을 경우라는 뜻인듯.)
      // 정확히 if (!map.containsKey(arr[i][0])) 
      // 이 코드가 어째서 key(arr[i][0])가 중복일 경우 초기의 값을 사용하는건지 문의드린 상태.
 
>> // if (!map.containsKey(arr[i][0])) 라는 말은
최초 map에 주어진 key arr[i][0]이 없을 경우에만 key arr[i][0]을 할당하라 라는 뜻으로
한번 비어진 map key에 arr[i][0]으로 할당하면 그 값으로 map의 key를 계속 유지한다는 뜻으로 보이는 것 같다.
같은 key가 들어오더라도 이미 최초 빈 map에 할당된 key arr[i][0]를 대체하라는 말이 없으므로 처음 배정된 key 유지.
         
 
      if (!map.containsKey(arr[i][0])) {
        map.put(arr[i][0],arr[i][1]);
        }
      }
    }
    return map;
  } 
}
 
 
============================== 추가 Update ======================
>> // if (!map.containsKey(arr[i][0])) 라는 말은
최초 map에 주어진 key arr[i][0]이 없을 경우에만 key arr[i][0]을 할당하라 라는 뜻으로
한번 비어진 map key에 arr[i][0]으로 할당하면 그 값으로 map의 key를 계속 유지한다는 뜻으로 보이는 것 같다.
같은 key가 들어오더라도 이미 최초 빈 map에 할당된 key arr[i][0]를 대체하라는 말이 없으므로 처음 배정된 key 유지
 
>> if(!result.containsKey(arr[i][0])) { 의 경우 저 조건이 없다면,
Map의 특성상 중복된 Key가 들어오면 중복된 Key에 해당하는 Value를 교체해버린다.
그러므로 최초 해당 Key가 없을 경우에만 Key를 할당한다는 조건이 필요.
반대로 중복된 Key가 있으면 새로운것으로 대체한다 라는 상황이라면 저 조건문을 아예 없애거나 !만 없애면 된다.