Java의 다중 집합 데이터 구조

Muhammad Adil 2023년6월20일
  1. Java에서 Multiset을 구현하는 옵션
  2. Java의 다중 집합 데이터 구조 예
  3. Java에서 Multiset의 편리한 구현
Java의 다중 집합 데이터 구조

다중 집합은 동일한 값의 여러 요소를 저장할 수 있는 데이터 구조입니다. C++에서 표준 템플릿 라이브러리(STL)에는 요소 삽입, 제거 및 검색을 위한 편리한 작업을 제공하는 다중 집합 구현이 포함되어 있습니다.

이 데이터 구조는 컬렉션의 요소 빈도를 계산해야 하는 경우와 같은 다양한 응용 프로그램에서 유용합니다.

그러나 Java에 C++ STL과 같은 다중 집합 데이터 구조가 있습니까? 짧은 대답은 ‘예’입니다.

Java에서 Multiset을 구현하는 옵션

Java는 다음을 포함하여 다중 집합을 구현하기 위한 여러 옵션을 제공합니다.

  1. Map 사용: Map은 키를 값에 매핑하는 컬렉션이며 다중 집합을 구현하기 위한 한 가지 옵션은 키가 요소이고 값이 빈도인 Map을 사용하는 것입니다. 요소를 삽입하려면 빈도를 늘리고 요소를 제거하려면 빈도를 줄일 수 있습니다.
  2. 목록 또는 배열 사용: 또 다른 옵션은 목록 또는 배열을 사용하여 요소를 저장한 다음 루프를 사용하여 각 요소의 빈도를 계산하는 것입니다. 이 접근 방식은 요소의 빈도를 찾는 데 선형 시간이 필요하므로 컬렉션 크기가 클 때 느려질 수 있습니다.
  3. 타사 라이브러리 사용: Google의 Guava 라이브러리 및 Apache Commons Collections와 같이 Java용 다중 집합 구현을 제공하는 여러 타사 라이브러리를 사용할 수 있습니다. 이러한 라이브러리는 C++ STL multiset과 유사한 편리한 구현을 제공하며 구현을 작성하지 않으려는 경우 좋은 옵션이 될 수 있습니다.

따라서 Java에는 C++ STL과 같은 다중 집합 데이터 구조가 있지만 구현은 핵심 Java 라이브러리의 일부가 아닙니다. 대신 Java에서 다중 집합을 구현하려면 Map, List 또는 Array 또는 타사 라이브러리를 사용해야 합니다.

Java의 다중 집합 데이터 구조 예

다음은 Map<E, Integer>를 사용하는 Java의 다중 집합 데이터 구조에 대한 간단한 예입니다.

import java.util.HashMap;
import java.util.Map;

public class MapMultiset<E> {
  private Map<E, Integer> map;

  public MapMultiset() {
    map = new HashMap<>();
  }

  public void add(E element) {
    Integer count = map.get(element);
    if (count == null) {
      count = 0;
    }
    map.put(element, count + 1);
  }

  public int count(E element) {
    Integer count = map.get(element);
    return count == null ? 0 : count;
  }

  public void remove(E element) {
    Integer count = map.get(element);
    if (count == null) {
      return;
    }
    if (count == 1) {
      map.remove(element);
    } else {
      map.put(element, count - 1);
    }
  }

  public static void main(String[] args) {
    MapMultiset<String> multiset = new MapMultiset<>();
    multiset.add("apple");
    multiset.add("banana");
    multiset.add("apple");
    multiset.add("orange");

    System.out.println("Frequency of apple: " + multiset.count("apple"));
    System.out.println("Frequency of banana: " + multiset.count("banana"));
    System.out.println("Frequency of orange: " + multiset.count("orange"));

    multiset.remove("apple");
    System.out.println("Frequency of apple after removing one: " + multiset.count("apple"));
  }
}

이 예제에서는 Map<E, Integer>를 사용하여 다중 집합을 구현합니다. 맵은 요소를 키로 저장하고 해당 빈도를 값으로 저장합니다.

다중 집합에 요소를 추가하고, 요소의 빈도를 찾고, 요소의 한 항목을 제거할 수 있는 add, countremove 메소드가 있습니다.

add 메서드는 맵에서 요소의 현재 개수를 검색하고 null인 경우 0으로 설정합니다. 그런 다음 메소드는 카운트에 1을 추가하고 업데이트된 카운트를 지도에 저장합니다.

count 메소드는 맵에서 요소의 개수를 검색하여 반환하거나 요소가 맵에 없으면 0을 반환합니다.

remove 메서드는 맵에서 요소의 개수를 검색하고 null인 경우 즉시 반환합니다. 개수가 1인 경우 메서드는 맵에서 요소를 제거합니다.

이 메서드는 카운트가 1보다 크면 업데이트된 카운트를 감소시키고 맵에 저장합니다.

코드가 실행되면 multiset에 여러 요소를 추가하고, 각 요소의 빈도를 찾고, "apple" 요소의 발생 하나를 제거하고, 각 요소의 빈도를 인쇄합니다.

코드를 확인하려면 여기를 클릭하세요.

Java에서 Multiset의 편리한 구현

Java에서 편리하고 효율적인 다중 집합 구현을 찾고 있다고 가정합니다. Guava 또는 Apache Commons Collections와 같은 타사 라이브러리를 사용하는 것이 좋습니다.

이러한 라이브러리는 요소 및 기타 유틸리티 메서드를 삽입, 제거 및 검색하기 위한 다양한 작업을 포함하여 풍부한 기능 세트를 제공합니다.

Muhammad Adil avatar Muhammad Adil avatar

Muhammad Adil is a seasoned programmer and writer who has experience in various fields. He has been programming for over 5 years and have always loved the thrill of solving complex problems. He has skilled in PHP, Python, C++, Java, JavaScript, Ruby on Rails, AngularJS, ReactJS, HTML5 and CSS3. He enjoys putting his experience and knowledge into words.

Facebook