Java/컬렉션

[Java]HashMap 키를 기준으로 삭제하는 방법

DevStory 2022. 8. 30.

HashMap 키를 기준으로 삭제하는 방법

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

 

HashMap의 키(Key)는 고유한 값으로 중복될 수 없지만, 값(Value)은 중복될 수 있습니다.

 

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


방법 1. HashMap의 remove 메서드

첫 번째 방법으로 HashMap 클래스에서 제공하는 remove() 메서드를 사용하여 특정 키가 존재하는 요소를 삭제할 수 있습니다.

public V remove(Object key);

remove() 메서드는 키를 매개변수로 전달받으며, HashMap의 요소를 삭제합니다.

 

정상적으로 삭제되면, 해당 키와 매핑되는 값을 반환합니다.

 

만약, HashMap에 키가 존재하지 않는 경우 null을 반환합니다.

 

다음 예제는 String 타입인 키와 Integer 타입인 값으로 구성된 HashMap에서 키가 "Java", "Svelte"인 요소를 삭제합니다.

public static void main(String args[]) {
  HashMap<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("\n[삭제 중]");
  System.out.println("키가 \"Kotlin\"인 요소의 값은? " +
          hm.remove("Kotlin"));

  System.out.println("키가 \"Svelte\"인 요소의 값은? " +
          hm.remove("Svelte"));

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

[실행 결과]

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

[삭제 중]
키가 "Kotlin"인 요소의 값은? 3000
키가 "Svelte"인 요소의 값은? null

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

방법 2. 특정 키와 특정 값이 존재하는 요소를 삭제

HashMap의 remove() 메서드는 매개변수가 두 개인 오버로드된 버전이 존재합니다.

public boolean remove(Object key, Object value);

첫 번째 방법에서 소개한 remove() 메서드는 특정 키가 존재하는 요소를 삭제했지만, 지금 소개하는 remove() 메서드는 특정 키와 특정 값이 존재하는 요소를 삭제합니다.

 

HashMap의 요소를 정상적으로 삭제한 경우 true를 반환하고 그렇지 않으면 false를 반환합니다.

 

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

- Key가 "Java"이고 Value가 3000

- Key가 "Kotlin"이고 Value가 3000

public static void main(String args[]) {
  HashMap<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("\n[삭제 중]");
  System.out.println("키가 \"Kotlin\"인 요소의 값은? " +
          hm.remove("Java", 3000));

  System.out.println("키가 \"Svelte\"인 요소의 값은? " +
          hm.remove("Kotlin", 3000));

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

[실행 결과]

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

[삭제 중]
키가 "Kotlin"인 요소의 값은? false
키가 "Svelte"인 요소의 값은? true

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

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

HashMap의 키가 특정 조건을 만족하면, 해당 요소를 삭제해야하는 상황이 발생할 수 있습니다.

 

KeySet() 메서드를 사용하여 키를 컬렉션으로 추출한 뒤 Collection 클래스에서 제공하는 removeIf() 메서드를 사용합니다.

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

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

 

removeIf() 메서드는 조건을 만족하는 요소를 한 개 이상 삭제하면 true를 반환하고 그렇지 않으면 false를 반환합니다.

 

다음 예제는 키에 문자열 "Script"가 포함된 요소를 삭제합니다.

public static void main(String args[]) {
  HashMap<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("\nKey에 문자열 \"Script\"가 포함된 요소가 삭제되었는가? " +
          hm.keySet().removeIf(item -> item.contains("Script")));

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

[실행 결과]

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

Key에 문자열 "Script"가 포함된 요소가 삭제되었는가? true

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

방법 4. 다중 삭제

삭제해야 하는 키가 여러 개인 경우 매번 remove() 메서드를 호출하는 것은 비효율적입니다.

 

keySet() 메서드를 사용하여 키를 컬렉션으로 추출한 뒤 Collection 클래스에서 제공하는 removeAll() 메서드를 사용합니다.

boolean removeAll(Collection<?> c);

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

 

removeAll() 메서드는 특정 값을 만족하는 요소를 한 개 이상 삭제하면 true를 반환하고 그렇지 않으면 false를 반환합니다.

 

다음 예제는 HashMap의 키가 "React", "C Sharp", "Kotlin"인 요소를 모두 삭제합니다.

public static void main(String args[]) {
  HashMap<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("\nKey가 \"React\", \"C Sharp\", \"Kotlin\"인 요소가 제거되었는가? " +
          hm.keySet().removeAll(Arrays.asList("React", "C Sharp", "Kotlin")));

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

[실행 결과]

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

Key가 "React", "C Sharp", "Kotlin"인 요소가 제거되었는가? true

[삭제 후]
{TypeScript=2000, Java=1000, JavaScript=2000}
반응형

댓글