Java/컬렉션

[Java]HashMap 특정 값이 존재하는지 확인하는 방법

DevStory 2022. 8. 30.

HashMap 특정 값이 존재하는지 확인하는 방법

이번 포스팅은 HashMap에 특정 조건을 만족하는 값 또는 특정 값이 존재하는지 확인할 수 있는 몇 가지 방법을 소개합니다.


방법 1. HashMap의 containsValue 메서드

첫 번째 방법으로 HashMap 클래스에서 제공하는 containsValue() 메서드를 사용하는 것입니다.

public boolean containsValue(Object value);

containsValue() 메서드는 매개변수로 전달된 값이 HashMap에 존재하면 true를 반환하고 그렇지 않으면 false를 반환합니다.


예제 1. 기본 타입

다음 예제는 값(Value)이 Integer 타입인 HashMap에서 특정 값 존재 여부를 콘솔에 출력합니다.

public static void main(String args[]) {
  Map<String, Integer> hm = new HashMap<>();
  hm.put("둘리", 10);
  hm.put("또치", 20);
  hm.put("마이콜", 30);

  System.out.println("10은 존재하는가? " + hm.containsValue(10));
  System.out.println("50은 존재하는가? " + hm.containsValue(50));
}

[실행 결과]

10은 존재하는가? true
50은 존재하는가? false

예제 2. 참조 타입

HashMap의 값(Value) 타입이 사용자가 정의한 클래스처럼 참조 타입인 경우 실제 데이터가 아닌 참조 값을 비교합니다.


따라서, 다음 예제처럼 필드의 값이 동일하더라도 false를 반환합니다.

 

[Person 클래스]

public class Person {
  private String Name;
  private Integer Age;

  public Person(String name, Integer age) {
    Name = name;
    Age = age;
  }
}

[Main문]

public static void main(String args[]) {
  Map<String, Person> hm = new HashMap<>();
  hm.put("1000", new Person("둘리", 10));
  hm.put("2000", new Person("또치", 20));
  hm.put("3000", new Person("마이콜", 30));

  System.out.println("new Person(\"둘리\", 20)인 값이 존재하는가? " +
          hm.containsValue(new Person("둘리", 10)));

  System.out.println("new Person(\"마이콜\", 30)인 값이 존재하는가? " +
          hm.containsValue(new Person("마이콜", 30)));
}

[실행 결과]

new Person("둘리", 20)인 값이 존재하는가? false
new Person("마이콜", 30)인 값이 존재하는가? false

참조 값이 아닌 필드의 값을 비교하도록 Person 클래스에서 hashCode() 메서드와 equals() 메서드를 재정의합니다.

 

다음 예제는 hahsCode() 메서드와 equals() 메서드가 재정의된 Person 클래스입니다. Person 클래스를 아래 소스 코드로 변경 후 다시 실행하면, containsValue() 메서드는 false가 아닌 true를 반환합니다.

public class Person {
  private String Name;
  private Integer Age;

  public Person(String name, Integer age) {
    Name = name;
    Age = age;
  }

  @Override
  public int hashCode() {
    int prime = 31;
    int result = 1;
    result = prime * result + ((Name == null) ? 0 : Name.hashCode());
    result = prime * result + ((Age == null) ? 0 : Age.hashCode());
    return result;
  }

  @Override
  public boolean equals(Object obj) {
    if (this == obj) {
      return true;
    }
    if (obj == null) {
      return false;
    }
    if (getClass() != obj.getClass()) {
      return false;
    }
    Person other = (Person) obj;
    return Objects.equals(Name, other.Name) && Age == other.Age;
  }
}

방법 2. 반복문 및 조건문

HashMap 클래스에서 제공하는 containsValue() 메서드의 단점은 특정 값이 존재하는지 확인할 수 있지만, 특정 조건을 만족하는지 확인할 수 없다는 것입니다.

 

특정 조건을 만족하는 값이 있는지 확인할 수 있는 가장 심플한 방법은 반복문과 조건문을 사용하는 것입니다.

 

다음 예제는 HashMap의 값이 20 이상인 경우 콘솔에 키와 값을 출력합니다.

public static void main(String args[]) {
  Map<String, Integer> hm = new HashMap<>();
  hm.put("둘리", 10);
  hm.put("또치", 20);
  hm.put("마이콜", 30);

  for (String key: hm.keySet()){
    if(hm.get(key) >= 20) {
      System.out.println("{" + key + " => " + hm.get(key) + "}");
    }
  }
}

[실행 결과]

{마이콜 => 30}
{또치 => 20}

방법 3. Stream API

마지막 방법으로 Java 버전이 1.8 이상인 경우 Stream API를 사용할 수 있습니다.

 

Stream에서 제공하는 anyMatch() 메서드는 스트림에 특정 조건을 만족하는 요소가 하나라도 존재하는 경우 true를 반환하고 그렇지 않으면 false를 반환합니다.

 

HashMap의 값을 스트림으로 변환 후 anyMatch() 메서드를 호출하여 특정 조건 또는 특정 값 존재 여부를 확인합니다. 

 

다음 예제는 HashMap의 값이 20 이상이고 20으로 나누었을 때, 나머지가 0인 값이 존재하는지 확인합니다.

public static void main(String args[]) {
  Map<String, Integer> hm = new HashMap<>();
  hm.put("둘리", 10);
  hm.put("또치", 20);
  hm.put("마이콜", 30);

  boolean isExists = hm.values().stream().anyMatch(num -> num >= 20 && num % 20 == 0);

  System.out.println("HashMap의 값이 20 이상이고 20으로 나누었을 때, 나머지가 0인 값이 존재하는가? " + 
          isExists);
}

[실행 결과]

HashMap의 값이 20 이상이고 20으로 나누었을 때, 나머지가 0인 값이 존재하는가? true
반응형

댓글