Java/컬렉션

[Java]HashMap 값을 기준으로 삭제하는 방법

DevStory 2022. 8. 30.

HashMap 값을 기준으로 삭제하는 방법

Java의 HashMap은 <Key, Value> 형식의 데이터를 가지는 컬렉션입니다.

 

HashMap 클래스는 특정 키가 존재하면 데이터를 삭제하는 remove() 메서드와 모든 데이터를 삭제하는 clear() 메서드를 제공합니다. 하지만, 값을 기준으로 HashMap의 요소를 삭제할 수 있는 메서드는 제공하지 않습니다.

 

그러나, HashMap이 아닌 다른 클래스에서 제공하는 메서드를 사용한다면, 값을 기준으로 HashMap의 요소를 삭제할 수 있습니다.

 

이번 포스팅은 값을 기준으로 HashMap의 요소를 삭제할 수 있는 몇 가지 방법을 소개합니다.


방법 1. Value를 컬렉션으로 반환 후 remove 메서드 호출

첫 번째 방법으로 HashMap의 values() 메서드와 Collection의 remove() 메서드를 사용합니다.

public Collection<V> values();

 

[제거 방법]

순서 1. HashMap에서 values() 메서드를 호출하여 HashMap의 값의 집합을 컬렉션으로 반환합니다.

순서 2. 반환된 컬렉션에서 remove() 메서드를 호출하고 삭제하고 싶은 특정 값을 매개변수로 전달합니다.

 

다음 예제는 String 타입인 키와 Integer 타입인 값으로 구성된 HashMap에서 값이 1000인 요소를 제거합니다.

public static void main(String args[]) {
  Map<String, Integer> hm = new HashMap<>();
  hm.put("React", 1000);
  hm.put("Java", 2000);
  hm.put("JavaScript", 3000);
  hm.put("TypeScript", 4000);
  hm.put("C Sharp", 5000);
  hm.put("Kotlin", 6000);

  System.out.println("[삭제 전]");
  System.out.println(hm);

  System.out.println("\nValue가 1000인 요소가 제거되었는가? " +
          hm.values().remove(1000));

  System.out.println("\n[삭제 후]");
  System.out.println(hm);
}

[실행 결과]

[삭제 전]
{TypeScript=4000, Java=2000, C Sharp=5000, JavaScript=3000, React=1000, Kotlin=6000}

Value가 1000인 요소가 제거되었는가? true

[삭제 후]
{TypeScript=4000, Java=2000, C Sharp=5000, JavaScript=3000, Kotlin=6000}

Remove 메서드의 단점

Collection 클래스에서 제공하는 Remove() 메서드는 시작 위치와 가장 가까운 위치의 데이터를 제거합니다. 즉, Remove() 메서드는 중복되는 요소가 존재하더라도 한 개의 요소만 제거할 수 있습니다.

 

따라서, HashMap의 값이 다음과 같이 중복된 경우 Remove() 메서드는 한 개의 요소만 제거한다는 문제점이 존재합니다.

public static void main(String args[]) {
  Map<String, Integer> hm = new HashMap<>();
  hm.put("React", 1000);
  hm.put("Java", 1000);
  hm.put("JavaScript", 1000);
  hm.put("TypeScript", 1000);
  hm.put("C Sharp", 1000);
  hm.put("Kotlin", 1000);

  System.out.println("[삭제 전]");
  System.out.println(hm);

  System.out.println("\nValue가 1000인 요소가 제거되었는가? " +
          hm.values().remove(1000));

  System.out.println("\n[삭제 후]");
  System.out.println(hm);
}

[실행 결과]

[삭제 전]
{TypeScript=1000, Java=1000, C Sharp=1000, JavaScript=1000, React=1000, Kotlin=1000}

Value가 1000인 요소가 제거되었는가? true

[삭제 후]
{Java=1000, C Sharp=1000, JavaScript=1000, React=1000, Kotlin=1000}

방법 2. 다중 삭제

제거해야 하는 값이 여러 개이며, 중복되는 값을 모두 제거하고 싶다면 Collection 클래스에서 제공하는 removeAll() 메서드를 사용합니다.

boolean removeAll(Collection<?> c);

removeAll() 메서드의 매개변수는 Collection 타입이므로 제거해야 하는 값을 컬렉션 형식으로 전달합니다.

 

다음 예제는 HashMap의 값이 1000, 2000인 요소를 모두 제거합니다.

public static void main(String args[]) {
  Map<String, Integer> hm = new HashMap<>();
  hm.put("React", 1000);
  hm.put("Java", 1000);
  hm.put("JavaScript", 2000);
  hm.put("TypeScript", 2000);
  hm.put("C Sharp", 3000);
  hm.put("Kotlin", 3000);

  System.out.println("[삭제 전]");
  System.out.println(hm);

  System.out.println("\nValue가 1000, 2000인 요소가 제거되었는가? " +
          hm.values().removeAll(Arrays.asList(1000, 2000)));

  System.out.println("\n[삭제 후]");
  System.out.println(hm);
}

[실행 결과]

[삭제 전]
{TypeScript=2000, Java=1000, C Sharp=3000, JavaScript=2000, React=1000, Kotlin=3000}

Value가 1000, 2000인 요소가 제거되었는가? true

[삭제 후]
{C Sharp=3000, Kotlin=3000}

방법 3. HashMap의 값이 특정 조건을 만족하면 삭제

HashMap의 값이 특정 값이 아닌 특정 조건을 만족해야 하는 경우 Collection 클래스에서 제공하는 removeIf() 메서드를 사용합니다.

default boolean removeIf(Predicate<? super E> filter);

removeIf() 메서드의 매개변수로 Predicate 타입의 객체 또는 람다 표현식을 전달합니다.

 

다음 예제는 HashMap의 값이 400으로 나누었을 때, 나머지가 0인 요소를 모두 제거합니다.

public static void main(String args[]) {
  Map<String, Integer> hm = new HashMap<>();
  hm.put("React", 1000);
  hm.put("Java", 1000);
  hm.put("JavaScript", 2000);
  hm.put("TypeScript", 2000);
  hm.put("C Sharp", 3000);
  hm.put("Kotlin", 3000);

  System.out.println("[삭제 전]");
  System.out.println(hm);

  System.out.println("\nValue를 400으로 나누었을 때, 나머지가 0인 요소가 제거되었는가? " +
          hm.values().removeIf(num -> num % 400 == 0));

  System.out.println("\n[삭제 후]");
  System.out.println(hm);
}

[실행 결과]

[삭제 전]
{TypeScript=2000, Java=1000, C Sharp=3000, JavaScript=2000, React=1000, Kotlin=3000}

Value를 400으로 나누었을 때, 나머지가 0인 요소가 제거되었는가? true

[삭제 후]
{Java=1000, C Sharp=3000, React=1000, Kotlin=3000}
반응형

댓글