Java/컬렉션

[Java]HashMap value로 key 찾기

DevStory 2022. 4. 4.

이번 포스팅은 HashMap에서 value로 key를 찾는 다양한 방법들을 소개합니다.


value을 사용하여 key를 찾는 방법(1:1)

HashMap 클래스는 키(key)-값(Value) 쌍을 저장할 수 있는 Java의 컬렉션입니다. 키를 사용하여 값을 얻으려면 get() 메서드의 매개변수로 키를 전달하면 됩니다.

 

하지만, 키를 직접적으로 가져오는 메서드는 존재하지 않습니다. 아래에서 소개하는 방법들을 사용한다면 키를 가져올 수 있으며 상황에 맞게 응용할 수 있습니다.


keySet() 메서드와 for 문

keySet() 메서드와 for 문을 사용하는 방법은 모든 키를 가져와서 반복문을 실행합니다. 키에 매핑된 값과 특정 값이 일치하면 키를 반환합니다. 이 방법은 키와 값이 1:1 관계인 경우에만 사용할 수 있습니다.

public static void main(String[] args) {
  String findKey = "";

  Map<String, Integer> map = new HashMap<>();
  map.put("John", 34);
  map.put("Jane", 26);
  map.put("Billy", null);

  // 모든 키를 순회합니다.
  for(String key : map.keySet()) {
    // 키와 매핑된 값이랑 equals() 메서드에 전달된 값이랑 일치하면 반복문을 종료합니다.
    if(map.get(key).equals(34)) { // 키가 null이면 NullPointerException 예외 발생
      findKey = key;
      break;
    }
  }
}
※ 참고
HashMap의 키는 null을 허용합니다. 위 예제에서 HashMap 키에 null이 존재하는 경우 NullPointerException 예외가 발생합니다.
반응형

entrySet() 메서드와 for 문

entrySet() 메서드와 for 문을 사용하는 방법은 위 방법과 유사합니다. 값도 가져올 수 있다는 차이점이 있으며 for문 대신 Iterator 객체를 사용할 수 있습니다.

public static void main(String[] args) {
  String findKey = "";

  Map<String, Integer> map = new HashMap<>();
  map.put("John", 34);
  map.put("Jane", 26);
  map.put("Billy", null);

  for(Map.Entry<String, Integer> entry : map.entrySet()){
    // 동일한 값이 있으면 반복문을 종료합니다.
    if(entry.getValue().equals(34)) { // 값이 null이면 NullPointerException 예외 발생
      findKey = entry.getKey();
      break;
    }
  }
}
※ 참고
HashMap의 값은 null을 허용합니다. 위 예제에서 HashMap 값에 null이 존재하는 경우 NullPointerException 예외가 발생합니다.

value을 사용하여 key를 찾는 방법(1:N)

위에서 설명한 방법들은 키와 값이 1:1 관계인 HashMap에서 동작합니다. 그러나 HashMap에서 키는 고유하지만 값은 중복될 수 있습니다. 이러한 경우에는 List를 사용하여 특정 값을 만족하는 키를 List에 추가합니다.

public static void main(String[] args) {
  List<String> keyList = new ArrayList<String>();

  Map<String, Integer> map = new HashMap<>();
  map.put("John", 34);
  map.put("Jane", 26);
  map.put("Billy", null);

  for(Map.Entry<String, Integer> entry : map.entrySet()){
    if(entry.getValue().equals(26) ){
      keyList.add(entry.getKey());
    }
  }
}
반응형

댓글