2012-05-14 4 views
-1

HashMap에 Null 값이 있는지 테스트하는 함수를 작성하고 있습니다. .values ​​() 메서드는 단지 값의 컬렉션을 반환해야하지만 대신 키와 값이 모두 저장된지도를받습니다. 내 함수의 목적은 값이 null인지 확인하는 것이므로 좋지 않지만 키와 값이있는지도를 반환하면 .values ​​(). 값이 저장되지 않은 키가 있으면 isEmpty()가 false를 반환합니다.HashMap에서 값 컬렉션을 검색하는 방법

public Map<KEY, List<VALUES>> methodName() { 
    if (MAPNAME.values().isEmpty()) { 
      throw new CustomErrorException(ExceptionHandler.getErrorWithDescription(ErrorConstants.ERROR_MSG_01)); 
     } else { 
      return MAPNAME; 
     } 
    } 

위의 예에서 .values ​​()는 항상 모든 키와 값을 포함하는지도를 반환합니다. HashMap에 키가있는 경우 내 메서드에서 CustomErrorException을 throw하지 않습니다. 값이없는 경우이를 감지하기 때문에 키가 잘못되었습니다. 도움!

+0

MAPNAME이란 무엇입니까? – jahroy

+0

@jahroy지도 > MAPNAME = 새 HashMap >(); – tamuren

+1

HashMaps는 null 값과 단일 null 키를 허용합니다. – jahroy

답변

4

값이 저장되지 않은 키가있는 Map 구현과 같은 것은 없습니다. 중 모든지도의 구현 : 값이

  • 는 키 항목 및 null 값을 추가 null의 경우

    • put에서 예외를 throw는

    null로 매핑 키는 매우 다르다 값이없는 키보다 키는 값을 가지며 그 값은 null입니다. 이는 맵이 비어 있지 않으면 값 컬렉션이 비어 있지 않음을 의미합니다. 값이없는 키는 맵에 포함되지 않은 키입니다.

    간단히 말하자면, MAPNAME.values().contains(null) 또는 심지어 MAPNAME.containsValue(null)을 사용하여 원하는 것을 할 수 있습니다. 또는 키가 null로 매핑되는지 확인하는 경우 .values ​​() 컬렉션을 반복하여 확인하십시오.

  • +0

    나를위한지도의 개념을 정리해 주셔서 감사합니다. MAPNAME.values ​​(). contains (null)를 사용하면 내 용도로 적합합니다. 마지막으로 한 일 - .values ​​()가해야 할 일은 정확히 무엇입니까? 필자의 경우 전체 해시 맵, 키 및 값을 반환했습니다. 방금 논리를 수행 할 값 배열이 필요했습니다. – tamuren

    +0

    죄송하지만 그 앞에서 오해하신 분입니다. HashMap.values ​​()는 HashMap을 반환하지 않습니다. HashMap과 Map은 Collection을 구현하지 않기 때문에 HashMap은 values ​​()에서 자신을 반환하면 컴파일되지 않습니다. values ​​() 메서드는 키가 참조하는 모든 값을 포함하는 Collection을 반환합니다. 중복이 가능합니다 (집합이 아닙니다). 그래서 3 개의 키가 'null'에 매핑되면, 'null'이 Collection에 3 번 있습니다. 또한 Collection 값에서 값을 제거하면지도가 업데이트됩니다. –

    +0

    이클립스에서 디버거에서 코드를 살펴보고 HashMap에 '값'이 포함되어 있는지 검사하면 'this'라고 표시됩니다. 'this'를 확장하면 키와 값을 포함한 전체 HashMap이 포함됩니다 (값은 다른 'this'로 연결되어 일련의 무한 HashMap을 서로 포함합니다). 그냥 sayin ' – tamuren

    1

    당신은지도를 반환하고 - 맵 이름을 아닌 값 :

    return MAPNAME.values(); 
    
    +0

    예, 맞습니다 - HashMap을 반환합니다. 내 문제는 HashMap에 키가 있지만 아무런 값도 저장하지 않는 이론 시나리오가 있으므로 HashMap에 키가 있으면 if 문에 오류 예외가 발생하지 않는다는 것입니다. 간단히 HashMap의 값을 반환하지만 값이 비어 있지 않은 경우 전체 HashMap을 반환하는 것은 아닙니다. – tamuren

    0

    당신은지도에 null 값이 포함되어 있는지 확인하려는 경우, 당신은 가치와 수표의 컬렉션을 반복한다 각 하나는 null인지 확인합니다.

    null 값이있는 항목이 포함 된 맵은 비어 있지 않습니다.

    +0

    MAPNAME.values ​​() 문제는 설명서 및 여러 예제에서 컬렉션을 반환해야한다고 명시되어 있지만 해시 맵을 반환합니다. 실제로 'values'의 값은 'this'입니다. 해시 맵 'values'가 저장되어 있습니다. – tamuren

    +1

    HashMap은 Collection입니다. –

    +0

    그러면 좀 더 구체적으로, MAPNAME.values ​​()는 NO 키가 저장된 값의 컬렉션 만 반환합니다. MAPNAME.values ​​()가 모든 키와 모든 값을 포함하는 맵을 반환하기 때문에 현재는 그렇지 않습니다. .values ​​()가 작동하도록되어있는 방법이 아닙니까? – tamuren

    0

    당신은 당신이 원하는 일에 대해 명확없는거야 -지도 값 목록입니다 - 주요지도를하는 세 가지 방법을 "no 값"가, 점을 고려 :

    • 키가 (다음 테스트가 map.values().contains(null)입니다)
    • 키가 null의 전체 목록에 매핑 빈리스트 (다음 테스트가 map.values().contains(Collections.emptyList())입니다)
    • 키에 매핑 null에 매핑.

    지도가 실제로 비어있는 경우 (키가없는 경우) 위의 방법으로 예외를 던지고 그렇지 않은 경우지도를 반환합니다.

    원하는 것이 분명하지 않습니다.이 예외를 throw

    public Map<KEY, List<VALUES>> methodName() { 
        for(List<VALUES> values : MAPNAME.values()) // 1 
         if(null != values) // 2 
          for(VALUES value : values) // 3 
           if(null != value) // 4 
            return MAPNAME; 
    
        throw new CustomErrorException(ExceptionHandler.getErrorWithDescription(ErrorConstants.ERROR_MSG_01)); 
    } 
    

    : 당신이 방법은 맵이 의미있는 값이없는 경우에만 예외를 throw 할 경우,이 같은 일이 당신이 필요로하는 것입니다 (모든 키 중 하나를 null로 또는 목록을 비울지도) (1)지도가 실제로 비어 있거나 (2) null 키만 포함되거나 (3) null 값 또는 빈 목록 만 포함하거나 (4) 모든 합리적으로 생각할 수있는 "빈지도"시나리오 null 값만 포함하거나 빈 목록 또는 null의 목록 만 포함합니다.

    (위의 텍스트에서 "공 상태"테스트의 레벨은 코드의 주석 레이블에 해당합니다).

    관련 문제